全表スキャン
全表スキャンを選択する上で最も重要な要素は速度である。これは、全表スキャンが最速であり、別のアクセス手法がない場合に使用することを意味する。全表スキャンを使う場合の例は次の通り。
インデックスがない場合
インデックスが存在しないため、オプティマイザは全表スキャンを使用する。
行数が少ない場合
テーブルが小さいため、全表スキャンのコストがインデックス範囲スキャンよりも低くなるとオプティマイザが見積もることがある。
インデックスがある状態で、クエリがSELECT COUNT(*)を処理して、インデックスされた列にNULLが存在する場合
この場合、オプティマイザはインデックスを利用して行数を数えられない。これはインデックスがNULLの項目を含められないため。
クエリによる結果がテーブルのほぼすべての行を取得する場合
戻り行の数が多すぎて、ほぼ100%のテーブル内容を取得する場合。この場合、クエリは「非選択的 (unselective)」であるという。
テーブル統計が更新されていない場合
テーブルの行数が当初小さかったものが直近で急激に大きくなり、テーブルの統計がまだ更新されていないとする。この場合、オプティマイザーは、コストを正しく見積もることができず、全表スキャンを選択してしまうことがある。
テーブルが高度な並列処理を備えている場合
高度な並列処理テーブルの場合、その程度によりオプティマイザーは全表スキャンを使用する選択をする場合がある。
クエリに全表スキャンヒントが指定されている場合
全表スキャンを使うようヒントが指定されていると、オプティマイザは全表スキャンを強制的に使用する。