2

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  
4

1 に答える 1