13

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

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

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

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

注: これは SQL Server 2000 用です。


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

ありがとう!

4

4 に答える 4

8

制約は ISO/ANSI SQL 標準のUNIQUE一部ですが、標準は実装にとらわれないため、インデックスはそうではありません。SQL Server は、ほとんどの SQL DBMS と同様に、インデックスを使用してUNIQUE制約を実装します。

おそらく、UNIQUESQL スクリプトで index ではなく使用する方が移植性がわずかに高くなりますが、最適化などの機会を提供する場合は、いつものように独自の構文を除外すべきではありません。

于 2008-10-21T15:24:35.537 に答える
5

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

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

どちらのオプションでも、既存のデータの「重複キーを無視」できますが、既存の値と重複する新しい値を挿入しようとすると、どちらもエラーが発生します。

于 2008-10-21T14:40:51.727 に答える
2

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

于 2008-10-21T14:45:34.323 に答える
2

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

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

于 2012-09-14T14:44:56.063 に答える