UNIQUEインデックスを“ index”として作成することの違いは何ですか?または“ constraint” SQL Serverで?

StackOverflow https://stackoverflow.com/questions/222065

質問

UNIQUE(ただし、テーブルの主キーではない)になる列にインデックスを作成する場合、SQLサーバーではいくつかのオプションを選択できます。

1)制約またはインデックスを選択できます。
これは、制約として設定した場合、クエリ時にのみ使用し、書き込み時にのみ使用することを意味すると推測しています。ただし、SQL Serverがその制約を実施するために考えられる唯一の効率的な方法は、実際にインデックスを作成することです。このオプションの用途は何ですか?

2)また、「インデックス」として設定した場合、重複キーを無視するように指定できます。 これは私にとって最も困惑しています...
再び制約の反対を意味すると思います。おそらく、「クエリ時に使用するが、書き込み時にもチェックしない」ことを意味します。
しかし、なぜそれをUNIQUEに設定するのですか?
SQL Serverで実行できる最適化がいくつかあると思いますが、よりよく理解したいと思います。

これらのオプションを使用してSQL Serverが正確に何を行うかを誰かが知っていますか? インデックスを一意に設定し、重複キーを無視するユースケースは何ですか?

注:これはSQL Server 2000用です


編集:しかし、あなたが言ったことによると...制約を作成する場合、制約内のフィールドを使用してフィルタリングするクエリを高速化するために使用されますか?

ありがとう!

役に立ちましたか?

解決

A UNIQUE 制約はISO / ANSI SQL標準の一部ですが、インデックスは標準が実装に依存しないためではありません。 SQL Serverは、ほとんどのSQL DBMSと共通して、インデックスを使用して UNIQUE 制約を実装します。

おそらく、SQLスクリプトでインデックスではなく UNIQUE を使用する方が移植性がわずかに優れていますが、最適化などの機会を提供する場合は常に独自の構文を除外すべきではありません。

他のヒント

SQL Serverは、一意の制約を実装するためのインデックスを作成します。 で一意の制約を実施するために使用される一意のインデックスへの参照を確認できます。 sys.key_constraints ビュー(2005年—申し訳ありませんが、2000に相当するものはわかりません)。ただし、どちらのバージョンもクエリ時にインデックスを使用します。

違いは、インデックスを作成する場合、構築方法をより詳細に制御できることです。特に、キーとともに頻繁に検索される追加の列を含めることができます。

両方のオプションを使用すると、「重複キーを無視する」ことができます。 既存のデータではありますが、既存の値を複製する新しい値を挿入しようとすると、両方でエラーが発生します。

ユニーク制約とデータベースの制約オブジェクトとしてリストされているという事実以外に、ユニーク制約とユニーク索引の間に実際的な違いはありません。

MSDNによると、一意の制約を使用して一意のインデックスを作成する場合と、CREATE UNIQUE INDEXステートメントを使用して明示的に作成する場合の間に大きな違いはありません。どちらの場合も、データの一意性は同じ方法で検証されます。また、クエリオプティマイザーはそれらをまったく異なる方法で処理しません。データの整合性が目標である場合は一意の制約を使用することをお勧めします。そうでない場合は、CREATE UNIQUE INDEXステートメントを直接使用します。

ここは優れた記事であり、両方のアプローチの違いを説明するビデオです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top