表からデータを選択は:たとえば
CREATE TABLE TBL (UserID, SomeTypeID, SomeSubType, Data
CONSTRAINT PK PRIMARY KEY (UserID, SomeTypeID, SomeSubType))
そして、作成されているデフォルトのインデックスはCLUSTERED
指標です。
通常(そうではないすべての回)のデータを探していたとき、あなたはあなたのクエリがインデックスのキーを形成する列は、あなたが行をフィルタリングするために使用した行を、フィルタリングするNON-CLUSTERED
インデックスを使用したいと思いますあなたは以下のように、この場合DATA
には、INCLUDED
列としてそれらの行から復帰情報(列):
CREATE NONCLUSTERED INDEX ncl_indx
ON TBL (UserID, SomeTypeID, SomeSubType) INCLUDE (Data);
をこれを行うことにより、あなたはCLUSTERED
インデックスを通じて、テーブルのデータにアクセスして回避しています。あなたは、これがPRIMARY KEY
のように定義されるようにしたいので、あなたではない、
CREATE TABLE TBL (UserID, SomeTypeID, SomeSubType, Data
CONSTRAINT PK PRIMARY KEY NONCLUSTERED (UserID, SomeTypeID, SomeSubType));
Buuut:
しかし、あなたはあなたのPRIMARY KEY
は、そうなりたいインデックスの種類を指定することができますINCLUDE
の機能を使用することができますので、ディスクの検索を避けて、のインデックスを基本的に持つDATA
列の情報を取得することはできません。
Buuuuuut、少数のディスクI/Oのようにしてくださいするように、主キーはINCLUDE
機能から、あなたとの利益を与えることを一意性を確保するための方法がまだあります。
NONCLUSTERED INDEX
をUNIQUE
と指定すると、インデックスキーを構成する3つの列すべてが一意であることが保証されます。
CREATE UNIQUE NONCLUSTERED INDEX ncl_indx
ON TBL (UserID, SomeTypeID, SomeSubType) INCLUDE (Data);
、これらのすべてを行うことで、あなたのテーブルにはHEAP
、which is not a very good thingになるだろう。テーブルを設計する上での良い考えを与えて、CLUSTERED INDEX
の最適なクラスタリングキーが(UserID、SomeTypeID、SomeSubType)であると判断した場合は、現在持っているものをそのまま残しておくことをお勧めします。
それ以外の場合は、別のクラスタリングキーを決定した場合は、このように一意のノンクラスタードインデックスを追加できます。
主キーはすでにソートのインデックスを作成しています。お互いに分離された他の列を照会したい場合を除き、主キーのみを使用することは問題ありません。詳細:https://msdn.microsoft.com/en-us/library/ms189039.aspx(Microsoft SQLを使用することを前提とします) –
可能な複製... http://stackoverflow.com/questions/462477/sql-primary -key-and-index?rq = 1 –