非クラスター化インデックスにクラスター化インデックス列を含める必要がありますか?


15

非クラスター化インデックスはクラスター化インデックスに基づいていることを考慮すると、非クラスター化インデックスには、クラスター化インデックスに含まれる列のいずれかをリストする必要がありますか?

言い換えると、ProductsテーブルにProductIDのクラスター化インデックスが含まれている場合、ProductID列を含めることが望ましい非クラスター化インデックスを作成するときに、列として追加する必要がありますか?

そうでない場合、非クラスター化インデックスに列名を追加するとよいシナリオはありますか?

回答:


19

SQL Serverでは、行ロケーターとして機能するために、クラスター化インデックスキー列が常に非クラスター化インデックスに追加されます(「非クラスター化インデックスキーの詳細」を参照)。

一意であると宣言されたNCIの場合、それらは含まれる列として追加されます。それ以外の場合、キーの最後に追加されます。

デフォルトの配置がクエリに最適でない場合は、明示的に列を追加することができます。たとえば、ASC/ DESC方向を制御する場合、またはインデックス内のキー列の位置を制御する場合。

CREATE TABLE T
(
A INT,
B INT,
C INT ,
PRIMARY KEY CLUSTERED (B DESC, C DESC)
)

/*Implicitly adds B DESC, C DESC to end of key*/
CREATE NONCLUSTERED INDEX ix1 ON T(A ASC) 

/*No sort operation*/
SELECT  *
FROM T
ORDER BY A ASC,B DESC, C DESC

/*
But the avove index won't be able to seek into A,C  
and will need a residual predicate after seeking into A.

For the following query
*/

SELECT  *
FROM T
WHERE A=1 AND C > 4
ORDER BY C ASC, B DESC

/*This index explicitly controlling the key column position 
  and direction would be better*/
CREATE NONCLUSTERED INDEX ix2 ON T(A ASC, C ASC, B DESC) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.