1

以下に示すように、テーブル A と B の間に単純な結合があります。さらに、各テーブルには Or 演算子と組み合わせた条件があります。

SELECT /*+ NO_EXPAND */
   * FROM  IIndustrialCaseHistory B ,
           IIndustrialCaseProduct A 
     where (
                                  A.ProductId  IN ('9_2') OR
                                  contains(B.KeyWords,'%some text goes here%' ) <=0

           )
       and ( B.Id = A.IIndustrialCaseHistoryId)

ProductId には B ツリー インデックスが定義され、KeyWords には関数インデックスがあります。しかし、私の実行計画がこれらのインデックスを使用せず、テーブル アクセスをフルに実行する理由がわかりません。私がこのURL で見つけたように、NO_EXPAND 最適化のヒントは、実行計画でインデックスを使用する可能性があります (NO_EXPAND ヒントは、コストベースのオプティマイザーが、OR 条件または WHERE 句の IN リストを持つクエリの OR 拡張を考慮しないようにします)。しかし、定義されたインデックスの使用は見られませんでした

私のクエリでオラクルの問題は何ですか?!

4

1 に答える 1

0

私が知らないcontains()関数について何か魔法のようなことがない限り、Oracleはインデックスを使用して、ワイルドカードで始まる一致する値、つまりvarchar2列内のテキスト文字列値を見つけることができませんが、最初からではありませんその値の位置。[OR B.KeyWords LIKE'%some text going here%' -- とは対照的に -- OR B.KeyWords LIKE'Some text starts here%' -- インデックス経由で最適化可能] オプティマイザは、デフォルトでフル テーブル スキャンに戻ります。その場合。また、重要ではないかもしれませんが、リストに値が 1 つしかないのに、なぜ IN() を使用するのでしょうか? A.ProductId = '9_2' ではないのはなぜですか?

于 2014-11-06T23:05:20.687 に答える