web-dev-qa-db-ja.com

非PK一意識別子にはインデックスまたは一意キーを使用する必要がありますか?

SQL Server 2014を使用して、PKフィールドがintであるテーブルがいくつかありますが、クエリに使用する必要があるUniqueIdentifierフィールドもあります。このフィールドは常に一意です。

これらのインデックスを追加しています。IndexまたはUnique Keyを選択するオプションがあります。

どちらか一方を選択するメリットはありますか?

4
Scottie

一意のキーはインデックスです。値が一意であることが保証されている場合は、これが最良の選択です。

一意キー:一意キーは、それらが定義されている列の一意性を強制します。一意キーは、列に非クラスター化インデックスを作成します。一意のキーは、1つのNULL値のみを許可します。

8
indiri

ここではまだ言及されていないいくつかのこと。

1つ目は、UNIQUE制約は参照整合性にも使用できることです。 一意の制約とチェック制約 に関するBOLの記事によると:

UNIQUE制約は、FOREIGN KEY制約によって参照できます。

これは、取得したい複雑さによってはデータベース設計に役立ちますが、より重要なのは Grant Fritcheyが説明しています であり、FOREIGN KEYを作成すると、特定のタイプのクエリのパフォーマンスを向上させるのにも役立ちます。それに対する制約。

次に、これはおそらくより重要な事実です。UNIQUE制約は、たとえインデックス定義がまったく同じであっても、UNIQUE以外の同等のインデックスよりも小さい可能性があります。非クラスター化インデックスがUNIQUEとして定義されている場合、クラスター化キーは暗黙的にINCLUDE列として格納されます(非クラスター化インデックスはクラスター化キーを指す必要があるため)。または、非クラスター化インデックスがUNIQUEとして定義されていない場合、クラスター化キーは暗黙的に非クラスター化インデックスキーに追加され、インデックスのすべてのレベルに存在します(大きくなります)。 Kalen Delaneyは、これが 非クラスター化インデックスキー および 非クラスター化インデックスキーの詳細 に関する彼女の投稿でなぜ発生するかを説明するはるかに優れた仕事をしています。

5
John Eisbrener

どちらも基本的には同じです。インデックスは一意である必要はありません。主キーが実行し、PKがレコードを識別します。一意の識別子は、実際には同じ値を持たない列により多く適用されます。何をしているのかによりますが、両方が必要な場合もあります。

0
DCook