2

私は日付(日数)とフィールドのローカルインデックス(日付フィールドを含む)でパーティションテーブルを持っています。 t.fdate = '30は.06.2011'どのようにパーティション化されたテーブルからOracleのクエリを最適化するには?

それはすぐに満たし、私は

SELECTを作る*されたテーブルTから

SELECT *:私は、クエリを作成する場合EXTRACT(t.fdateから月)= 6、 EXTRACT(t.fdateから年)= 2011

それは秒約200を満たしているWHEREテーブルTからonds。

このクエリを最適化するにはどうすればよいですか? EXTRACT(月から日付)とEXTRACT(年から日付)にローカル索引を作成する必要がありますか?

答えて

6

日付フィールドにインデックスがあるので、このインデックスを使用できるようにクエリを記述する必要があります。これは、EXTRACT関数では不可能です.Oracleはすべてのデータを調べて、一致するかどうかを判断するために各行の条件を計算する必要があるからです。

特定の日付または日付の範囲がある場合は、日付インデックスを使用できます。あなたの場合、あなたは日付の範囲を探しています。したがって、クエリは次のように書くことができます:

SELECT * FROM TABLE T 
WHERE T.FDATE BETWEEN TO_DATE('1.6.2011', 'DD.MM.YYYY') AND TO_DATE('30.6.2011', 'DD.MM.YYYY'); 
+0

Codo、ありがとう! – DmitryB

+0

@Codo:私は同様の問題に遭遇しました。あなたの答えがそのようなクエリをより速く実行させると確信しています。しかし、パフォーマンスを向上させる理由は、パーティションのプルーニングが可能になるからです。なぜなら、インデックスの使用が許可されているわけではないからです。 –

+0

私はあなたのソリューションと同じクエリを実行しますが、HHMMSSを含めると(私たちのタイムスタンプはデータのいくつかでミリ秒に達することさえあります)。 – fa1c0n3r

関連する問題