0

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
4

1 に答える 1

2

まず、誤解を払拭します。

そのような行が20%しかないとしましょう...フィルター選択されたインデックスを使用することは明らかです

いいえ、それはまったく明らかではありません。時々考慮されるためには、インデックスは約1%の選択性である必要があると思います. 通常、しきい値は 5% とされています。という記事がありましたが、どこか思い出せません。Googleで検索してください。

あなたの3つのバリアントについて

非クラスター化インデックス IX_Attrib1 を T1 に作成 (Attrib1、Attrib1Date) WHERE Attrib1 = 1

フィルター処理されたインデックスの SQL Server の実装のため、インデックス キーには Attrib1 が必要です。ただし、1 位になったからといって、非常に選択的になるわけではありません。

非クラスター化インデックス IX_Attrib1 を T1 に作成 (Attrib1Date、Attrib1) WHERE Attrib1 = 1

これは上記よりも選択的であり、好ましいでしょう。前提条件はフィルター選択されたインデックスの適用可能性をチェックするために使用されますが、その後は通常のクエリ エンジンが引き継ぎ、通常の選択性チェックなどを行います。

非クラスター化インデックス IX_Attrib1 を T1 (Attrib1Date) に作成 WHERE Attrib1 = 1

上記の理由により、処理が次のようになるため、これはあまり望ましくありません。

  1. クエリに含まWHERE Attrib1 = 1れるもの -> このインデックスを考慮することができます (他の可能性がある場合)
  2. Attrib1Date は十分に選択的ですか?
  3. インデックスには (Attrib1Date + record-pointer) が含まれています => これらはWHERE Attrib1 = 1条件を含め、リクエストを処理できますか

#3で失敗

非クラスター化インデックス IX_Attrib2 を T1 (Attrib2) に作成 WHERE Attrib2 = 1

filtered index applicabilityはい、インデックスを作成するためだけにこれを行い、列を含めることは、チェックを超えて引き継ぐ通常のクエリオプティマイザー/エンジン用です。

于 2012-10-01T10:18:50.607 に答える