オプティマイザは、全表スキャンの方が優れていると考えています。
NULL
が数個しかない場合 行、オプティマイザーは正しいです。
インデックスへのアクセスが高速になると確信している場合(つまり、75%
以上ある場合 col1 IS NULL
の行 )、クエリをヒントします:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
なぜ75%
?
INDEX SCAN
を使用しているため インデックスでカバーされていない値を取得することは、ROWID
での非表示の結合を意味します 、約4
の費用がかかります テーブルスキャンの倍。
インデックス範囲に25%
を超えるものが含まれている場合 行の場合、通常、テーブルスキャンの方が高速です。
Tony Andrews
が述べたように 、クラスタリング係数はこの値を測定するためのより正確な方法ですが、25%
それでも大まかな目安です。