0

開始時刻と終了時刻を含むイベントを表すテーブルがあります (DATE、TIMESTAMP、または TIMESTAMP WITH TIME ZONE 形式で保存されます)。

MY_TABLE:
DATA       START           END  
A      1/11/2012 10:00    1/11/2012 12:00
B      2/12/2012 08:00    2/12/2012 16:00

そして、そのようなテーブルに対して時間間隔でクエリを実行することがよくあります。

SELECT data
  FROM my_table
 WHERE start BETWEEN t1 AND t2; -- usually we either use start or end time for every row.

ここで、t1 と t2 は DATE/TIMESTAMP 値 st t1<= t2 です。

これらのクエリは大きなテーブルで実行されるため、上記のようなクエリを実行するためのより良い、つまりより効率的な方法はありますか?

現在、上記の構造を持つテーブルに時間データ列のいずれかにインデックスがあるかどうかはわかりませんが、それらを追加することはほとんど問題になりません。それらは、時間に関連しない他の列にインデックスを持っています。

分析関数 (パーティションなど) を使用すると、これらの種類のクエリを単純に BETWEEN..AND を使用するよりもはるかに効率的にできることを読んだことを覚えています。残念ながら、私はもうリンクを見つけることができず、分析機能についても知りません。ネット上のあちこちでいくつかの短い紹介を読んだだけです。

調査する時間がほとんどないため、私の理論を確認し、私の問題に関連する例を教えていただけないでしょうか。

言うまでもなく、私の問題に対する簡単な回答、コピー&ペーストするもの、私が正しい方向を見ているかどうかを理解するためのヒントを求めているわけではありません.

ティア

編集: @jonearles: 最初のステートメントについては同意しますが、分析関数を使用しても実際により効率的なクエリを提供でき ないかどうかを知りたいです。

後者の場合、はい、PARTITION BY 句を意味しました。分析関数は PARTITION BY 句で使用されることが想定されているため、これはばかげた仕様だと思います。前に言ったように、この件についてあまり詳しく調べていないので、混乱を招いてしまったことをお詫びします。

4

1 に答える 1

0

あなたのクエリはおそらく問題ありません。通常、述語を記述する最も簡単な方法が最適です。それはオラクルが期待していることであり、オラクルが最適化されている可能性が最も高いです。

オブジェクトの作成を検討して、アクセス方法を改善することをお勧めします。具体的には、インデックス(少量のデータを選択している場合) とパーティション(大量のデータを選択している場合) です。

「パーティション」は、Oracle では少なくとも 3 つの異なるものを意味します。おそらく、分析関数の「partition by」句とパーティショニングを混同していませんか?

于 2012-09-17T18:24:15.543 に答える