web-dev-qa-db-ja.com

インデックスのINCLUDEについて教えてください

ええと、Erik Darlingの投稿を読んだ後 Filtered Indexes:Just Add Includes 私はINCLUDESの使い方に本当に興味があり、悲しいです。

彼はINCLUDEについていくつかの例などを挙げていますが、私は彼が作成した実際のインデックスについて混乱しています。

これはクエリです:

SELECT Id, DisplayName
FROM   Users 
WHERE  Reputation > 400000;

私がすることは:

CREATE INDEX ix_bla on USERS (Reputation) 
INCLUDE (Id, DisplayName)

インデックスのWHEREにあるものを使用し、INCLUDEのそれらのフィールドにSELECTを使用する必要があると思いました。

しかし、エリックはこれをしました:

CREATE UNIQUE NONCLUSTERED INDEX Users_400k_Club
 ON dbo.Users ( DisplayName, Id )
 INCLUDE ( Reputation )
 WHERE Reputation > 400000
 WITH ( DROP_EXISTING = ON );

ここでの問題は、フィルタリングインデックスではありません。私の質問は、なぜ彼がインデックスでDISPLAYNAMEIDを使用し、インクルード句でREPUTATIONを使用しているのですか?

そして単純なテストのために、数百万行のテーブルでテストに対してこのクエリを実行します。

select COL1
      ,COL2
      ,COL3
from MyTable
    where COL2 > 4513516

SQLは、このインデックスを作成するように指示します。

CREATE NONCLUSTERED INDEX ix_nada
ON MyTable
    (
        [COL2]
    )
INCLUDE 
    (
        [COL1],
        [COL3]
    )
GO
2
Racer SQL

あなたが読んでしたことは正しいですか?

ユーザーテーブルにインデックスがない場合は、

CREATE INDEX ix_bla on USERS (Reputation) 
INCLUDE (Id, DisplayName)
WHERE Reputation > 400000;

このインデックスは大丈夫です。

しかし、これは@Erikが実証したかった点ではありませんでした。

そのブログによると、あなたがすでにそのようなインデックスを持っているとしましょう、

CREATE UNIQUE NONCLUSTERED INDEX Users_400k_Club
 ON dbo.Users ( DisplayName, Id )

そして、あなたはレピュテーションでフィルターされたインデックスを作成する必要があり、単にインクルードでそれを言及するだけで仕事が行われ、高価なインデックスを作成する必要がなくなります。

彼はこれを拒否し、

CREATE UNIQUE NONCLUSTERED INDEX Users_400k_Club
 ON dbo.Users ( DisplayName, Id )
 INCLUDE ( Reputation )
 WHERE Reputation > 400000
 WITH ( DROP_EXISTING = ON );

フィルターされたインデックス:インクルードを追加するだけ これは、彼が示したかったFiltered Indexの新しいポイントです。

2
KumarHarsh

エリックの意図は、DisplayNameで始まるインデックスがそのクエリのGOODインデックスであることを示すことではありませんでした。

彼の目的は、そのインデックスを使用することを示すだけでした。シークではなくスキャンを実行しているため、このシナリオには適していません。

ブログ投稿でクエリの完全なインデックスを本当に作成したい場合は、最初にレピュテーションにキーとして作成します(WHERE句はレピュテーションにあるため)。

0
Brent Ozar