2

特定のクエリの要件を満たすために、カバーする非クラスター化インデックスが作成されます。インデックスに 1 つの列が存在しない場合、SQL サーバーはキー ルックアップを実行する必要があります。キー ルックアップを防ぐために、カバリング インデックスが作成されますが、列の 1 つが含まれていないのに、以下がカバリング インデックスである理由がわかりません。

データベース: Adventureworks 2008 R2 テーブル: Production.WorkOrder インデックス名: IX_WorkOrder_ProductID

クエリ:

SELECT WorkOrderID,StartDate
FROM Production.WorkOrder
WHERE ProductID = 757;

インデックス IX_WorkOrder_ProductID は列 ProductID のみで始まります。これは削除され、次のように再作成されます。

CREATE INDEX IX_WorkOrder_ProductID
ON Production.WorkOrder (ProductID)
INCLUDE (StartDate);

実際の実行計画を実行した後、100% のコストでインデックス シーク (非クラスター化) を使用します。

私の質問は次のとおりです。列 WorkOrderID をインデックス IX_WorkOrder_ProductID に含める必要がないのはなぜですか? なぜ WorkOrderID のないカバリング インデックスなのですか?

4

1 に答える 1

4

WorkOrderIDはそのテーブルのクラスター化インデックスであるため、そのテーブルProduction.WorkOrderで作成するすべての非クラスター化インデックスに既に自動的に含まれています。

それを再び含める必要は本当にありません-それはすでにそこにあります。

したがって、新しいインデックスIX_WorkOrder_ProductIDは実際にはクエリをカバーしています-WorkOrderIDクラスタリングキーがすべての非クラスター化インデックスに存在するという事実のために存在し、ProductID列はインデックス定義の一部です。

クラスタリング インデックス キーは、そのテーブルのすべての非クラスタ化インデックスに含まれているため、クラスタリング キーを慎重に選択し、できるだけ小さくする必要があるもう 1 つの理由があります (理想的にはINTor ) BIGINT

于 2013-05-01T20:52:03.020 に答える