次のクエリがあります。
select id,
c1,
c2,
c3
from tbl t1
join
(select id
from tbl t2
where upper(replace(c5, ' ', '')) like upper(?)
) j
on j.id = t1.id
?
のようなワイルドカード パラメータ文字列です%test%
。
c5
列には、アクセスに使用される関数のインデックスがあります:
create index tbl_c5_idx on tbl(upper(replace(c5, ' ', '')))
内部クエリだけを実行するとtbl_c5_idx
、 が使用されますが、クエリ全体を実行すると、完全なテーブル スキャンになり、はるかに遅くなります。
テーブル全体のスキャンを回避する方法はありますか? 結合条件をヒントまたは書き換えます。入力条件によって内部クエリが動的に構築されるため、クエリ全体を書き換えることはできません。