Frage

Ich habe eine Zeit indiziert Oracle DB, die ich Abfrage nach Datumsbereich bin versucht. Ich mag auch Datenreduktion in der Abfrage zu tun, so dass ich nicht mit zu vielen Daten überwältigt.

Die Stand-alone-Datum Abfrage (2352 Zeilen 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' 

Der Ständer entlang Reduktion Abfrage (1017 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)

Wenn ich versuche, sie zu kombinieren es dauert ewig (48 Zeilen 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)

Offensichtlich etwas grundlegend hier mache ich falsch, aber ich weiß nicht, wie sonst sowohl Abfrage nach Datum und die Daten reduzieren.

War es hilfreich?

Lösung 4

Dank sowohl ‚Narveson‘ und ‚nate c‘ für die Zeiger ich es endlich herausgefunden. Hier ist die (wahrscheinlich Oracle-spezifisch) Abfrage, dass ich kam mit:

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

Diese Abfrage gibt 47 Zeilen in 0.031s. Die ursprüngliche Zeitabfrage hatte 2352 Zeilen, so dass Sinn macht.

Die ORAFAQ hat mir geholfen, auf die endgültige Lösung.

Andere Tipps

Sie Ihre Reduktion Logik gegen Reihen Auswertung, die nicht in der gewählten Zeitraum ist.

Tragen Sie die Reduktion Logik zu einer Unterabfrage des Datum enthält.

SPÄTER: Hier ist, was ich meinte.

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

Befreien Sie sich von der in

Warum verwenden:?

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

Ihre einzige Bedingung ist mod (rownum, 50)

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

letzte Zeile sollte AND mod(rownnum,50)=0 kein Selbst verbindet mit einer in sein.

Sie können auch lassen Oracle eine Stichprobe aus dem Ergebnis wählen, indem Sie die SAMPLE () Klausel:

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

Wird zufällig 50% Prozent der Zeilen zurück

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top