0

たとえば、レコードには 20 個のフィールドがあり、20 個のフィールドのうち 5 個のインデックス付きフィールドが含まれています。列に適切なインデックスが設定されている場合、データはインデックス付きフィールドで取得されます。以下の 2 つの状況について説明したいと思います。

  1. レコードからフィールドを取得する
  2. レコード全体を取得する

私が知っている唯一の違いは、ケース 1 ではシステムが少量のデータを使用するため、バス トラフィックに費やされる量が少ないということです。ただし、検索時間に関しては、これら 2 つのケースでハードウェア操作の点で違いがあるかどうかはわかりません。DB での検索タスクの主なコストは、フィールドの数に関係なくレコードを見つけることだと思います。これは正しいです?

4

2 に答える 2

0

いくつかの資料を読んで、私は結論に達しました:

  1. クエリを実行するときに必要なフィールドのみを選択します。
  2. インデックス付きフィールドのみがスキャンされる場合、DB は高速なインデックスのみの検索を実行します。
  3. インデックス付けされていないフィールドを含む多くの行をフェッチしようとすると、最悪の場合、クエリが行数と同じ数のブロック I/O を実行することになり、非常にコストがかかります。したがって、ブロック I/O の合計数がブロックの合計数と等しくなり、行数よりもはるかに小さくなる可能性があるため、完全なテーブル スキャンを実行することをお勧めします。
于 2013-04-19T03:17:16.840 に答える
0

ヒープベースのテーブルから取得していて、どちらの場合も WHERE 句が同じであると仮定します。

  1. 取得するフィールドがインデックスにあるかどうかは重要です。インデックスにある場合、DBMS はテーブル ヒープにアクセスする必要はありません。これは、インデックス オンリー スキャンと呼ばれます。インデックスにない場合、DBMS はフィールドが存在するヒープ ページにアクセスする必要があり、まだキャッシュされていない場合は追加の I/O が必要になる可能性があります。
  2. 行全体を読み取る場合、DBMS クエリ プランナーが使用することを選択したインデックスによってすべてのフィールドがカバーされる可能性は低いため、テーブル ヒープ アクセスの I/O コストを支払う可能性が高くなります。これは単一の行ではそれほど悪くはありませんが、多数の行が取得され、インデックスのクラスタリング係数が悪い1場合、パフォーマンスが完全に低下する可能性があります。

状況は似ていますが、クラスター化されたテーブルの場合は少し複雑です。これは、インデックスは CREATE INDEX で明示的に言及されていない場合でも PK フィールドをカバーする傾向があり、テーブルの「メイン」部分には (通常) 直接アクセスできず、インデックス シークを通じてアクセスできるためです。 .

その上、すでに述べたように、より多くのデータを転送すると、ネットワーク帯域幅への負担が大きくなります。

これらの理由から、常に必要なものだけを選択するようにしてください。


1優れたクエリ オプティマイザーは、インデックスが利用可能であっても、コストが低いため、これに気付き、フル テーブル スキャンを実行します。

于 2013-04-17T09:57:37.697 に答える