ええと、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 );
ここでの問題は、フィルタリングインデックスではありません。私の質問は、なぜ彼がインデックスでDISPLAYNAME
とID
を使用し、インクルード句でREPUTATION
を使用しているのですか?
そして単純なテストのために、数百万行のテーブルでテストに対してこのクエリを実行します。
select COL1
,COL2
,COL3
from MyTable
where COL2 > 4513516
SQLは、このインデックスを作成するように指示します。
CREATE NONCLUSTERED INDEX ix_nada
ON MyTable
(
[COL2]
)
INCLUDE
(
[COL1],
[COL3]
)
GO
あなたが読んでしたことは正しいですか?
ユーザーテーブルにインデックスがない場合は、
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
の新しいポイントです。
エリックの意図は、DisplayNameで始まるインデックスがそのクエリのGOODインデックスであることを示すことではありませんでした。
彼の目的は、そのインデックスを使用することを示すだけでした。シークではなくスキャンを実行しているため、このシナリオには適していません。
ブログ投稿でクエリの完全なインデックスを本当に作成したい場合は、最初にレピュテーションにキーとして作成します(WHERE句はレピュテーションにあるため)。