Oracle 10g データベースのビューを使用して、.NET アプリケーションにデータを提供しています。これの良いところは、ビューに数値 (12) が必要なため、.NET アプリケーションはこれを整数として認識することです。したがって、選択にはcast(field as NUMBER(12))
. これまでのところ、一部のフィールドで where 句を使用した場合のコストは 0.9k です。しかし面白いことに、これのビューを作成し、そのビューに対して where 句を使用してクエリを実行すると、コストが 0.9k から 18k になります。
EXPLAIN PLAN で突然すべてのインデックスがスキップされ、その結果、多数のフル テーブル スキャンが発生します。ビューを使用すると、なぜこれが起こるのでしょうか?
問題の単純化されたバージョン:
SELECT CAST (a.numbers AS NUMBER (12)) numbers
FROM tablea a
WHERE a.numbers = 201813754;
計画を説明する:
Plan
SELECT STATEMENT ALL_ROWSCost: 1 Bytes: 7 Cardinality: 1
1 INDEX UNIQUE SCAN INDEX (UNIQUE) TAB1_IDX Cost: 1 Bytes: 7 Cardinality: 1
問題ないインデックス ヒット
上記のクエリをビューに入れて同じクエリを実行すると、次のようになります。
SELECT a.numbers
FROM index_test a
WHERE a.numbers = 201813754;
インデックスは使用されません。計画の説明:
Plan
SELECT STATEMENT ALL_ROWSCost: 210 Bytes: 2,429 Cardinality: 347
1 TABLE ACCESS FULL TABLE TABLEA Object Instance: 2 Cost: 210 Bytes: 2,429 Cardinality: 347