Domanda

Ho un momento indicizzato DB Oracle, che sto cercando di query intervallo di date. Voglio anche fare riduzione dei dati nella query in modo da non vengo sopraffatto con troppi dati.

La query stand-alone data (2352 righe in 0.203s):

select oracle_time from t_ssv_soh_packets0
where oracle_time >= TIMESTAMP '2009-01-01 00:00:00' 
AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00' 

Lo stand lungo interrogazione di riduzione (1.017 in 0.89s):

select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)

Quando tento di combinarli ci vuole per sempre (48 righe in 32.547s):

select oracle_time from t_ssv_soh_packets0
where oracle_time >= TIMESTAMP '2009-01-01 00:00:00' 
AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00' 
AND (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)

Ovviamente sto facendo qualcosa di fondamentalmente sbagliato qui, ma non so in quale altro modo sia di query in base alla data e ridurre i dati.

È stato utile?

Soluzione 4

Grazie a entrambi 'Narveson' e 'c nate' per i puntatori ho finalmente capito. Ecco la (probabilmente Oracle specifico) query che mi si avvicinò con:

select oracle_time from t_ssv_soh_packets0 where oracle_time >= TIMESTAMP '2009-01-01 00:00:00' AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00' group by oracle_time, rownum having mod(rownum, 50)=0

Questa query restituisce 47 righe in 0.031s. La query tempo originale aveva 2352 righe in modo che abbia un senso.

Il ORAFAQ mi ha aiutato alla soluzione finale.

Altri suggerimenti

Si sta valutando la logica di riduzione contro le righe che non sono nella vostra gamma data scelta.

Applica la logica di riduzione ad una sottoquery contenente l'intervallo di date.

DOPO: Ecco quello che volevo dire.

select oracle_time from (
  select oracle_time, rownum as limited_row_num
  from t_ssv_soh_packets0 
  where oracle_time >= TIMESTAMP '2009-01-01 00:00:00'  
  AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00'  
) as time_range
where mod(limited_row_num,50) =  0

sbarazzarsi del in

Perché usare questo:?

select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)

La tua unica condizione è mod (rownum, 50)

select * from t where mod(rownum, 50)=0

ultima riga dovrebbe essere AND mod(rownnum,50)=0 non un self join con una in.

Si può anche lasciare Oracle scegliere un campione casuale dal risultato applicando la CAMPIONE () clausola :

SELECT oracle_time 
FROM t_ssv_soh_packets0
WHERE ...
SAMPLE(50)

Tornerà a caso il 50% per cento delle righe

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top