varchar2(2000) 列を持つ 2 億 2600 万行のテーブルがあります。最初の 10 文字は、関数索引を使用して索引付けされますSUBSTR("txtField",1,10)
。
次のようなクエリを実行しています。
select count(1)
from myTable
where SUBSTR("txtField",1,10) = 'ABCDEFGHIJ';
値はデータベースに存在しないため、「0」を返します。
説明計画は、実行された操作が「INDEX (RANGE SCAN)」であり、コストが 4 であることを示しています。このクエリを実行すると、平均で 114 秒かかります。
クエリを変更して、インデックスを使用しないように強制すると、次のようになります。
select count(1)
from myTable
where SUBSTR("txtField",1,9) = 'ABCDEFGHI';
説明計画は、操作が意味のある「TABLE ACCESS (FULL)」になることを示しています。費用は629,000です。このクエリを実行すると、平均で 103 秒かかります。
テーブル内のすべてのレコードを読み取り、フィールドで substr 関数を実行するよりも、インデックスのスキャンに時間がかかることを理解しようとしています。
フォローアップ: テーブルには 2 億 3000 万行以上あり、クエリは 17 行を返します。データベースにある新しい値を選択しました。最初は、データベースにない値で実行していて、ゼロ行が返されました。違いはないようです。
インデックス生成に関する情報のクエリ: CLUSTERING_FACTOR=201808147 LEAF_BLOCKS=1131660
AUTOTRACE ON と gather_plan_statistics を使用してクエリを実行しており、それらの結果が利用可能になったら追加します。
すべての提案をありがとう。