ヒープベースのテーブルから取得していて、どちらの場合も WHERE 句が同じであると仮定します。
- 取得するフィールドがインデックスにあるかどうかは重要です。インデックスにある場合、DBMS はテーブル ヒープにアクセスする必要はありません。これは、インデックス オンリー スキャンと呼ばれます。インデックスにない場合、DBMS はフィールドが存在するヒープ ページにアクセスする必要があり、まだキャッシュされていない場合は追加の I/O が必要になる可能性があります。
- 行全体を読み取る場合、DBMS クエリ プランナーが使用することを選択したインデックスによってすべてのフィールドがカバーされる可能性は低いため、テーブル ヒープ アクセスの I/O コストを支払う可能性が高くなります。これは単一の行ではそれほど悪くはありませんが、多数の行が取得され、インデックスのクラスタリング係数が悪い1場合、パフォーマンスが完全に低下する可能性があります。
状況は似ていますが、クラスター化されたテーブルの場合は少し複雑です。これは、インデックスは CREATE INDEX で明示的に言及されていない場合でも PK フィールドをカバーする傾向があり、テーブルの「メイン」部分には (通常) 直接アクセスできず、インデックス シークを通じてアクセスできるためです。 .
その上、すでに述べたように、より多くのデータを転送すると、ネットワーク帯域幅への負担が大きくなります。
これらの理由から、常に必要なものだけを選択するようにしてください。
1優れたクエリ オプティマイザーは、インデックスが利用可能であっても、コストが低いため、これに気付き、フル テーブル スキャンを実行します。