0

WHERE フィルターに完全なクエリ条件が含まれるように、フィルター選択されたインデックスを作成しています。このようなインデックスを使用すると、SQL ではキー列を追加する必要がありますが、キー列は不要になるようです。たとえば、次の表を考えてみましょう。

CREATE TABLE Invoice
(
    Id INT NOT NULL IDENTITY PRIMARY KEY,
    Data VARCHAR(MAX) NOT NULL,
    IsProcessed BIT NOT NULL DEFAULT 0,
    IsInvalidated BIT NOT NULL DEFAULT 0
)

テーブルに対するクエリは、処理する新しい請求書を探します。つまり、次のようになります。

SELECT *
FROM Invoice
WHERE IsProcessed = 0 AND IsInvalidated = 0

したがって、フィルター処理されたインデックスを使用してこれらのクエリを調整できます。

CREATE INDEX IX_Invoice_IsProcessed_IsInvalidated
ON Invoice (IsProcessed)
WHERE (IsProcessed = 0 AND IsInvalidated = 0)
GO

私の質問: キー列は何にする必要がありIX_Invoice_IsProcessed_IsInvalidatedますか? おそらくキー列は使用されていません。私の直感では、小さくてインデックス構造を比較的フラットに保つ列を選択することにしました。テーブルの主キー ( Id) を選択する必要がありますか? フィルター列の 1 つ、または両方ですか?

4

3 に答える 3

1

そのテーブルにはクラスター化インデックスがあるため、そのインデックスのキー列に何を入れるかは問題ではありません。意味Idは無料です。あなたができる唯一のことはinclude、テーブルへのキールックアップを除外するために、インデックスのリーフレベルで実際にデータを手元に置くために、インデックスの含まれるセクションのすべてです。または、キューが巨大な場合は、キー セクションで他の列が役立つ可能性があります。

そのテーブルに主キーがない場合はinclude、結合またはその他の目的で必要なすべての列をキー列として指定する必要があります。そうしないと、インデックスのリーフ レベルでデータ ページへの参照があるため、ヒープでの RID ルックアップが発生します。

于 2014-03-12T17:13:51.060 に答える
0

このフィルター選択されたインデックスがカバーするテーブルの割合は? 小さい場合は、テーブルにヒットせずにインデックスから「SELECT *」を処理するために、テーブル全体をカバーすることをお勧めします。これがテーブルの大部分である場合、これは最適ではありません。次に、クラスター化インデックスまたは主キーを使用することをお勧めします。今はどちらが最適かを忘れてしまったので、もっと調査する必要がありますが、同じであれば設定する必要があります。

于 2014-03-12T17:13:50.683 に答える
0

次のように宣言することをお勧めします

CREATE INDEX IX_Invoice_IsProcessed_IsInvalidated
ON Invoice (Id)
INCLUDE (Data)
WHERE (IsProcessed = 0 AND IsInvalidated = 0)

INCLUDE 句は、データ列の値がインデックスの一部として格納されることを意味します。

INCLUDE 句がない場合、クエリ プランは

SELECT Id, Data
FROM Invoice
WHERE IsProcessed = 0 AND IsInvalidated = 0

2段階のプロセスが含まれます

  • インデックスを使用して、基準に一致する主キー値のリストを見つけます
  • これらの主キーに一致するテーブルからデータを取得します

一方、インデックスに [Data] 列が含まれている場合は、主キーを使用してデータを検索する必要がないため、クエリを適切にカバーします。

あなたはただで何かを得るわけではありません

これの欠点は、これらのレコードに対して varchar(MAX) データを 2 回保存することになるため、データベースに書き込むデータがさらに必要になり、より多くのストレージが使用されることです。データのごく一部について話しているだけです。

いつものように、物を慎重に片付けるのに時間と労力を費やすほど、それらを元に戻すのがより速く簡単になります.

于 2014-08-22T13:11:13.377 に答える