オプティマイザは、全表スキャンの方が優れていると考えています。
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% それでも大まかな目安です。