現在、特定の表に対して2つの索引を持つデータベースを使用しています。私が望むインデックスには、2つのカラム "Name"(varchar2)と "Time"(数字)があります。クエリを書き込むと、インデックスが使用されません(STARTVALUEとENDVALUEは数字です)。Stumped - 値が指定されても、Oracleは索引を使用しませんが、同じ値を戻す場合は、同じ値を返します。
SELECT SOMETHING
FROM MYTABLE
WHERE NAME = 'SOME-NAME'
AND TIME BETWEEN STARTVALUE AND ENDVALUE
しかし、代わりに次のクエリを使用すると
SELECT SOMETHING
FROM MYTABLE
WHERE NAME = 'SOME-NAME'
AND TIME BETWEEN MY_FUNC('STARTQUAL') AND MY_FUNC('ENDQUAL')
があります。
唯一の違いは、MY_FUNCがNUMBER型の値を明示的に返していることです。クエリオプティマイザが明示的に指定されたSTARTVALUEおよびENDVALUEのデータ型について混乱している可能性があります。タイプの競合が原因であると述べた類似のスレッドがいくつか見られました)。
注:MY_FUNCによって返される
値は、私が最初のクエリに指定していますEXACTLY同じ値です。問題の
指数は間違いなく(全く問題)正しいインデックス使用すると、実行時間が速くそれがないとき桁違いにありません。
- 私は最初のクエリでクエリヒントを指定していて、インデックスの使用を拒否しています。
私が見落としている愚か/単純なものがなければならないことは知っていますが、私はそれを見ることができません。
ご協力いただきありがとうございます。ここで
いくつかの質問に:OracleのDBのバージョンは何ですか? 'TIME <= STARTQUALとTIME> = ENDQUAL'を試しましたか?あなたはEXPLAIN PLANを印刷できますか? – Guru
'BETWEEN'に' to_number(STARTQUAL) 'を追加してみてください。 'MY_FUNC'定義を貼り付けることはできますか? – Guru
うわー、すばらしい返答をいただきありがとうございます...私は< and > =を使ってみましたが、違いはありません。説明計画の鍵は、RANGE SCANではなくSKIP SCANを実行していることです。 – user1251193