3

日付範囲で照会しようとしている時間インデックス付きのOracleDBがあります。また、大量のデータに圧倒されないように、クエリでデータ削減を行いたいと思います。

スタンドアロンの日付クエリ(0.203秒で2352行):

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' 

スタンドアロングリダクションクエリ(0.89秒で1017):

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

それらを組み合わせようとすると、永遠にかかります(32.547秒で48行):

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)

明らかに、私はここで根本的に間違ったことをしていますが、日付によるクエリとデータの削減の両方を行う方法が他にわかりません。

4

4 に答える 4

2

選択した日付範囲にない行に対して削減ロジックを評価しています。

日付範囲を含むサブクエリに削減ロジックを適用します。

後で:これが私が意味したことです。

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
于 2010-12-14T23:41:45.193 に答える
1

を取り除くin

なぜこれを使うのですか?:

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

唯一の条件はmod(rownum、50)です

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

最後の行は、。AND mod(rownnum,50)=0との自己結合であってはなりませんin

于 2010-12-14T23:57:55.353 に答える
1

SAMPLE()句を適用することにより、結果からランダムなサンプルをOracleに選択させることもできます。

SELECT oracle_time
FROM t_ssv_soh_packets0
どこ ...
サンプル(50)

行の50%パーセントをランダムに返します

于 2010-12-15T21:41:22.513 に答える
0

ポインタの「Narveson」と「natec」の両方のおかげで、私はついにそれを理解しました。これが私が思いついた(おそらくOracle固有の)クエリです:

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

このクエリは、0.031秒で47行を返します。元の時間クエリには2352行が含まれていたため、これは理にかなっています。

ORAFAQは、私が最終的な解決策にたどり着くのに役立ちました。

于 2010-12-15T20:48:05.920 に答える