いくつかのデータベースディスカッションでカバーインデックスという用語を聞いたばかりですが、どういう意味ですか?
covering indexは、クエリに必要なすべての列、場合によってはそれ以上の列を含むインデックスです。
たとえば、これ:
SELECT *
FROM tablename
WHERE criteria
通常、インデックスを使用して、criteriaを使用して取得する行の解決を高速化しますが、行全体を取得するには、テーブル全体に移動します。
ただし、インデックスに列column1、column2およびcolumn3が含まれている場合、次に、このSQL:
SELECT column1, column2
FROM tablename
WHERE criteria
また、特定のインデックスを使用して取得する行の解決を高速化できる場合、インデックスには目的の列の値が既に含まれているため、行を取得するためにテーブルに移動する必要はありません。 、ただし、インデックスから直接結果を生成できます。
これは、一般的なクエリで1-2列を使用して行を解決し、通常1-2列を追加することがわかっている場合にも使用できます。追加の列を追加すると便利です(すべて同じである場合) )クエリプロセッサがインデックス自体からすべてを取得できるようにします。
カバリングインデックスは単なる普通のインデックスです。データを分析する必要なくクエリを満たすことができる場合、「カバー」と呼ばれます。
例:
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つです。
カバリングインデックスは、特定のテーブルから必要なすべての列を「カバー」するインデックスであり、特定のクエリ/操作のために物理テーブルにアクセスする必要がなくなります。
インデックスには目的の列(またはそれらのスーパーセット)が含まれているため、テーブルアクセスをインデックスルックアップまたはスキャンに置き換えることができます。これは一般にはるかに高速です。
カバーする列:
多くの場合、インデックスをカバーすることで検索のメリットは大きくなりますが、挿入/更新のオーバーヘッドが多少増えます。更新ごとに追加のインデックス行またはより大きなインデックス行を書き込む必要があるため。
結合インデックスのパフォーマンステクニックとして、カバーインデックスはおそらく最も価値があります。これは、結合クエリのコストが高く、単一テーブルの検索よりもコストパフォーマンスの問題が発生する可能性が高いためです。
例えば:
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);
見る: