Question

J'ai un temps indexé Oracle DB que je suis en train de requête par plage de dates. Je veux aussi faire la réduction des données dans la requête, donc je ne pas se laisser submerger avec trop de données.

La requête date stand alone (2352 rangées dans 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' 

La position le long de requête de réduction (1017 à 0.89s):

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

Lorsque je tente de les combiner cela prend une éternité (48 lignes 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)

Il est évident que je fais quelque chose de fondamentalement mauvais ici, mais je ne sais pas comment à la fois la requête par date et réduire les données.

Était-ce utile?

La solution 4

Merci à la fois « Narveson » et « c nate » pour les pointeurs j'ai finalement compris. Voici la requête (probablement spécifique Oracle) que je suis venu avec:

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

Cette requête renvoie 47 lignes 0.031s. La requête de temps d'origine avait 2352 lignes de manière qui fait sens.

Le ORAFAQ m'a aidé à la solution finale.

Autres conseils

Vous évaluez votre logique de réduction contre les lignes qui ne sont pas dans votre gamme de date choisie.

Appliquer la logique de réduction à une sous-requête contenant votre plage de dates.

PLUS TARD: Voici ce que je voulais 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

Débarrassez-vous de la in

Pourquoi utiliser ceci:

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

Votre seule condition est mod (rownum, 50)

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

dernière ligne devrait être AND mod(rownnum,50)=0 pas auto se joindre à un in.

Vous pouvez également laisser Oracle choisir un échantillon aléatoire du résultat en appliquant le SAMPLE () clause :

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

Retournera 50% pour cent au hasard des lignes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top