一意のインデックスと一意のキーの違いは何ですか?
7 に答える
ユニークな作品は違いがどこにあるかではありません。インデックスとキーは同じものではなく、比較することもできません。
キーは、主キーまたは明示的に定義された一意性制約のいずれかの制約で一意になるように強制されるデータ列または複数の列です。一方、インデックスは、より高速に取得できるようにデータの場所を格納するための構造です。
ドキュメントから:
テーブルまたはビューに一意のインデックスを作成します。一意のインデックスとは、2つの行が同じインデックスキー値を持つことを許可されていないインデックスです。ビューのクラスター化されたインデックスは一意である必要があります
UNIQUE制約を使用して、主キーに関与しない特定の列に重複する値が入力されないようにすることができます。UNIQUE制約とPRIMARYKEY制約はどちらも一意性を強制しますが、主キーではない列または列の組み合わせの一意性を強制する場合は、PRIMARYKEY制約の代わりにUNIQUE制約を使用します。
この2つを比較するMSDNの記事は、あなたが求めているものです。用語は「制約」がANSIであるようなものですが、SQLServerでは一意性制約を無効にすることはできません...
ほとんどの場合、違いはありません。制約は、内部のインデックスとして実装されます。MSDNの記事はこれを裏付けています。違いは、次のようなメタデータにあります。
- FILLFACTORを微調整する
- INCLUDEは、より効率的なカバーインデックスを提供します(複合制約)
- フィルタリングされたインデックスは、行のサブセットに対する制約のようなものです/複数のnullなどを無視します。
「ユニークキー」はトートロジーです。キー(別名「候補キー」)は、データベースの論理機能であり、テーブル内の一連の属性の一意性を強制する制約です。
インデックスは、何らかの方法でパフォーマンスを最適化することを目的とした物理レベルの機能です。インデックスには多くの種類があります。
一意キー:データベースに制限を課す制約です。その制限は、重複する値を許可しないことです。たとえば、主キーとして1つの列を選択する場合は、NOT NULL&UNIQUEにする必要があります。
一意のインデックス:データベースでクエリを実行する際のパフォーマンスを向上させるインデックスです。一意のインデックスでは、インデックスの値を重複させることもできません。つまり、2つの行が同じインデックスキー値を持つことはありません。
主な違いは次のとおりです。
目的:
- 一意キー:テーブルレベルでデータの整合性を確保し、テーブルに重複を入力できないようにします。クエリプランニングには使用されません。クエリ速度には影響しません。(主キーとは目的が異なります。主キーは、更新/削除などのデータ操作で各レコードを一意に識別します。複雑なテーブルでは、一意のキーは複数の列の組み合わせである可能性があり、レコードを識別するために一意のキーを使用するのは非効率的です。したがって、主キーはテーブル内の特定のレコードをすばやく識別する方法ですが、一意キーは2つのレコードが同じキー属性を持たないことを保証します。)
- 一意のインデックス:インデックスレベルでデータの一意性を保証します。たとえば、フィルター処理されたインデックスの場合、テーブルレベルでの一意性を保証することはできません。クエリプランニングとデータのフェッチに使用されるため、使用/クエリされた列に応じてクエリが高速化されます。
フィルタオプション:
- 一意キー:フィルターオプションは使用できません
- 一意のインデックス:フィルターオプションが利用可能です
ストレージオプション:
- 一意キー:ファイルグループのみ
- 一意のインデックス:ファイルグループまたはパーティション
アイコン:
キー(別名キーワード)とインデックスはどちらもテーブル行の識別子です。
インデックスは並列識別構造であり、識別された行へのポインタを含みますが、キーはその場のフィールドメンバーです。
識別子としてのキーは、一意性(制約)とNOT NULL(制約)を意味します。NULLには、識別子(nullは何も識別できないため)および一意でない識別値としての意味はありません。
非クラスター化インデックスには、実際のデータを含めることができ、実際のデータの識別子として機能しないため、一意ではありません[1]
キーまたはインデックス(識別子)が制約(ルールまたは制限)によって呼び出されるのは残念なことですが、ここでのこれまでのほとんどの回答はこれに従いました。
キーは次のコンテキストで使用されます。
- 代替別名セカンダリ別名候補キー、複数にすることができます
- 複合キー(いくつかのフィールドを組み合わせたもの)
- 主キー(スーパーキー)、自然キーまたは代理キー、1つのみ、参照整合性に実際に使用
- 外部キー
外部キーは別のテーブル(主キー)のキーであり、頻繁に参照されるキーではありません。このような使用法は、「外部キー制約」という用語の短縮を「外部キー」と混同することによって説明されます。
主キー制約は、実際にはNOT NULLおよびUNIQUE制約を意味します+参照される列(または結合された列)は識別子であり、残念ながら「主キー」または「主キー制約」に置き換えられますが、どちらも(主キーのみ)では呼び出すことができません)制約または(主)キーのみによる。
更新:
私の関連する質問:
[1]
INDEX作成のためのUNIQUE引数-何のためですか?
機能は多かれ少なかれ同じです、それはあなたのユースケースに依存します。
CUSTOMER_IDとTEAM_NAMEに基づいて重複行を許可するとします。
その場合、次の両方を使用できます。
- 一意のインデックス
idx_customer_id_name
(CUSTOMER_ID
、TEAM_NAME
) - 一意キー
unique_key_customer_id_name
(CUSTOMER_ID
、TEAM_NAME
)
ただし、CUSTOMER_IDとTEAM_NAMEに基づいてレコードをフェッチする頻度を考慮する必要があります。それ以上の場合は、レコードの取得を高速化するのに役立つ一意のインデックスを使用する必要があります。そうでない場合は、インデックスに基づくフェッチの傍受を防ぐため、一意のキーを使用する必要があります。