T1というテーブルがあるとしましょう
CREATE TABLE T1
(
GID INT NOT NULL,
Attrib1 BIT NOT NULL,
Attrib1Date DATE NOT NULL,
Attrib2 BIT NOT NULL,
CONSTRAINT PK_T1 PRIMARY KEY (GID)
)
ここで、Attrib1 が 1 に等しい、または Attrib2 が 1 に等しい行のみが興味深いクエリのインデックスを作成しています。そのような行が 20% しかないとしましょう。
Attrib1 から Attribe2 への相関関係については気にしないでください - これらは 2 つの別々の例に対してのみ与えられています。
フィルタリングされたインデックスを使用することは明らかです-つまり、WHERE句を使用したINDEX-esです。しかし、問題はどの列を含めるかです。
サンプルクエリ:
SELECT * FROM T1 WHERE Attrib1 = 1 ORDER BY Attrib1Date
SELECT * FROM T1 WHERE Attrib2 = 1
例と質問 1)
どちらのINDEXがより正しいですか?
CREATE NONCLUSTERED INDEX IX_Attrib1
ON T1 (Attrib1, Attrib1Date)
WHERE Attrib1 = 1
また
CREATE NONCLUSTERED INDEX IX_Attrib1
ON T1 (Attrib1Date, Attrib1)
WHERE Attrib1 = 1
また
CREATE NONCLUSTERED INDEX IX_Attrib1
ON T1 (Attrib1Date)
WHERE Attrib1 = 1
例と質問 2)
次のように、フィルター処理される列のみを含むフィルター処理されたインデックスを作成するのは正しいですか。
CREATE NONCLUSTERED INDEX IX_Attrib2
ON T1 (Attrib2)
WHERE Attrib2 = 1