web-dev-qa-db-ja.com

対象インデックスとは何ですか?

いくつかのデータベースディスカッションでカバーインデックスという用語を聞いたばかりですが、どういう意味ですか?

65
Martynnw

covering indexは、クエリに必要なすべての列、場合によってはそれ以上の列を含むインデックスです。

たとえば、これ:

SELECT *
FROM tablename
WHERE criteria

通常、インデックスを使用して、criteriaを使用して取得する行の解決を高速化しますが、行全体を取得するには、テーブル全体に移動します。

ただし、インデックスに列column1、column2およびcolumn3が含まれている場合、次に、このSQL:

SELECT column1, column2
FROM tablename
WHERE criteria

また、特定のインデックスを使用して取得する行の解決を高速化できる場合、インデックスには目的の列の値が既に含まれているため、行を取得するためにテーブルに移動する必要はありません。 、ただし、インデックスから直接結果を生成できます。

これは、一般的なクエリで1-2列を使用して行を解決し、通常1-2列を追加することがわかっている場合にも使用できます。追加の列を追加すると便利です(すべて同じである場合) )クエリプロセッサがインデックス自体からすべてを取得できるようにします。

記事:インデックスカバーがSQL Serverのクエリパフォーマンスを向上させる が対象です。

カバリングインデックスは単なる普通のインデックスです。データを分析する必要なくクエリを満たすことができる場合、「カバー」と呼ばれます。

例:

CREATE TABLE MyTable
(
  ID INT IDENTITY PRIMARY KEY, 
  Foo INT
) 

CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)

SELECT ID, Foo FROM MyTable -- All requested data are covered by index

これは、SQLサーバーからデータを取得する最速の方法の1つです。

13
aku

カバリングインデックスは、特定のテーブルから必要なすべての列を「カバー」するインデックスであり、特定のクエリ/操作のために物理テーブルにアクセスする必要がなくなります。

インデックスには目的の列(またはそれらのスーパーセット)が含まれているため、テーブルアクセスをインデックスルックアップまたはスキャンに置き換えることができます。これは一般にはるかに高速です。

カバーする列:

  • パラメータ化された条件または静的条件。パラメーター化された条件または定数条件によって制限された列。
  • 列を結合します。結合に動的に使用される列
  • 選択された列。選択した値に答えます。

多くの場合、インデックスをカバーすることで検索のメリットは大きくなりますが、挿入/更新のオーバーヘッドが多少増えます。更新ごとに追加のインデックス行またはより大きなインデックス行を書き込む必要があるため。

結合クエリのインデックスのカバー

結合インデックスのパフォーマンステクニックとして、カバーインデックスはおそらく最も価値があります。これは、結合クエリのコストが高く、単一テーブルの検索よりもコストパフォーマンスの問題が発生する可能性が高いためです。

  • 結合されたクエリでは、カバーインデックスはテーブルごとと見なされる必要があります。
  • 各「カバーインデックス」は、プランから物理テーブルアクセスを削除し、インデックスのみのアクセスに置き換えます。
  • 計画コストを調査し、カバーするインデックスで置き換える価値のあるテーブルを実験します。
  • これにより、大規模な結合プランの乗算コストを大幅に削減できます。

例えば:

select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';

create index porder_custitem on porder (orderdate, id, status, fk_customer);

見る:

2
Thomas W