2017-11-29 4 views
0

テーブルにインデックスを作成するために使用する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の

+0

[クラスタ化および非クラスタ化インデックス(https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described):「インデックス列からポインタ行ロケータの構造は依存します...クラスタ化されたテーブルの場合、行ロケータはクラスタ化されたインデックスキーです。 "したがって、PKがクラスタ化されている場合、「主キーはとにかくデータを取得するために使用されていません」と誤っています。 –

答えて

1

を使用して

データ行

また

CREATE UNIQUE NONCLUSTERED INDEX KeyName3 
ON Person ([First Name], [Last Name], [PersonID) 

CREATE NONCLUSTERED INDEX KeyName4 
ON Person ([First Name], [Last Name], [PersonID]) 

も機能的に同一です。主キーがキー列として明示的に含まれるたびに、主キー値によってのみ実行されても、索引は技術的に一意の索引になります。 KeyName3にユニークな修飾子を追加することは、SQL Serverが主キーの存在によって既に保証されている3つの列すべての組み合わせの一意性を引き続き検証するため、リソースの無駄です。

クラスタ化キーは、クラスター化インデックス内のデータ行を指すように、非クラスター化インデックスにすべて含まれています。クラスタリングキーがプライマリキーまたはユニークキーの場合、キー値はデータ行を識別するために使用されます。クラスタ化キーが一意の値でない場合、SQL Serverは各データ行に一意の値を追加して識別できます。ただし、追加の行を挿入/削除できるようにするためのパディングがあるため、その追加値は、ソートの目的で明示的な索引キーの後にあると見なされます。

クラスタ化インデックス(ヒープ)がない場合、暗黙の一意の値がデータ行を指すために使用されます。ただし、データをソートする索引キーがなければ、行は順序を決して変更しないため、パディングはなく、一意の値は実質的に行番号になります。

関連する問題