テーブルにインデックスを作成するために使用するAPIは、プライマリキーを含む一意のインデックスとしてすべてのノンクラスタードインデックスを作成します。ノンクラスタードインデックス:プライマリキーを含むユニークインデックスとプライマリキーを持たない非ユニークインデックス
CREATE TABLE Person
(
[PersonID] INT NOT NULL PRIMARY KEY, -- clustered key on this col.
[First Name] VARCHAR(50),
[Last Name] VARCHAR(50),
[Other Columns] VARCHAR(50)
)
APIによって作成された非クラスタ化インデックスのSQL文は、このようなものになります:インデックス、その中に主キーを含めることにより
CREATE UNIQUE NONCLUSTERED INDEX KeyName
ON Person ([First Name], [Last Name], [PersonID])
をので、次の表を与え
すべてのエントリが一意であることが保証されます。私は約21万レコードを含むテーブルの上に二回以下なステートメントを使用
CREATE NONCLUSTERED INDEX KeyName2
ON Person ([First Name], [Last Name])
:
個人的に私はこのようなインデックスを作成しているだろう。私は一度にインデックスの1つだけをアクティブにしていました。
SELECT *
FROM Person
WHERE [First Name] = 'John'
AND [Last Name] = 'Doe'
「推定CPUコスト」、「推定I/Oコスト」、「推定オペレータコスト」と「見積サブツリーコストは」関係なく有効化/無効化されたものを指標とまったく同じではなかったです。
非クラスタ化インデックスを理解していれば、主キーはデータを取得するために使用されるのではなく、SQL-Serverが個別に割り当てる行番号です。したがって、NON-UNIQUEインデックスに対してUNIQUEインデックスを使用する利点はありますか?
UNIQUEインデックスにもう1つの列が含まれているため、より多くのディスク領域を占有すると思います。そのため、私は後者の方が好きです。 PERSONIDがあなたの主キーである場合は、
CREATE NONCLUSTERED INDEX KeyName
ON Person ([First Name], [Last Name])
と
CREATE NONCLUSTERED INDEX KeyName2
ON Person ([First Name], [Last Name], [PersonID])
の間には、ストレージ差がないPERSONIDが暗黙のうちに識別するために、キー名に追加されたSQL-Server 2012の
[クラスタ化および非クラスタ化インデックス(https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described):「インデックス列からポインタ行ロケータの構造は依存します...クラスタ化されたテーブルの場合、行ロケータはクラスタ化されたインデックスキーです。 "したがって、PKがクラスタ化されている場合、「主キーはとにかくデータを取得するために使用されていません」と誤っています。 –