2012-04-21 15 views
42

countriesというテーブルがあり、SQL Server 2008 R2で "ユニークキー"タイプの "インデックス/キー"を作成することによって、country_name列を一意にすることを定義します。SQL Server 2008のユニークキーとユニークインデックス

しかし、私は次のような質問があります。

  1. はタイプの「インデックス/キー」「一意キー」を作成しますが、自動的にこの列の非クラスタ化インデックスを作成しますか?
  2. 「ユニークキー」から「インデックス」にタイプを変更した場合、IsUniqueの値を「はい」にしておくと、違いはありますか?
  3. なぜ「ユニークキー」と「インデックス」の2つのオプションがありますか?2つは同じだと思いますか?

答えて

59

ユニークなインデックスとしてユニークな制約がインラインで実装されているため、どのように指定するかは関係ありません。私は単純に次のように実装する傾向があります。

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar); 

一部の人が代わりにユニークなインデックスを作成します。

CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar); 

違いは意図している - あなたは一意/ビジネスルールを強制する制約を作成している場合は、制約を作成、クエリのパフォーマンスを支援するためにそうしている場合は、作成するより論理的であるかもしれませんユニークなインデックス。再度、カバーの下では同じ実装ですが、そこに着く道はあなたの意図を文書化するのに役立ちます。

私は以前のSybaseの機能とANSI標準を遵守するための複数のオプションがあると思います(ユニークな制約は標準の100%に準拠していませんが、一方、一意のインデックスは、WHERE句(WHERE col IS NOT NULL)をSQL Server 2008以上に追加することで回避できます。

+0

情報の差別化だけではわかりませんが、インデックスがユニークインデックスの代わりに制約として定義されているかどうかを知るために 'sys_indexes'カラムに' is_unique_constraint'があります。 –

+1

@Andre Yep、これはメタデータの列なので、* user *はもともと制約として宣言されているかどうかを知ることができます。それは意図については何も教えてくれませんし、インデックス自体の物理的な実装と一意性の強制は同じです。 –

10

さらに言及しておきたいことは、インデックスを作成すると、含まれている列を指定できることです。これにより、country_nameで検索するとSQLコードがより速く動作するのに役立ちます。

​​

SQL Serverはインデックス自体に "foo_other_column"を格納します。ユニーク制約の場合は、最初に 'test'のインデックスを検索し、次にfooテーブルの行を検索し、そこにのみ "foo_other_column"を取ります。