web-dev-qa-db-ja.com

主キーと一意のインデックス:外部キーとのパフォーマンスの違い?

次のいずれかとの関係がある2つのテーブル間の結合を介してデータをフェッチするクエリを比較すると、パフォーマンスに違いがありますか?

  • 主キー
  • ユニークなインデックス
7
Daniel

それ自体はパフォーマンスとは関係ありませんが、概念的な問題です。

UNIQUE CONSTRAINTを使用して、事実を述べます。主キーを追加したためなど、たまたま一意であるインデックスがある場合は、UNIQUE INDEXを使用します。

シナリオに従って:

主キー

  • 各行の識別子を保持する場合。したがって、各行はKey値によって取得できます(pkは一意であり、nullではないため)。

一意のキー

  • 同じテーブル内にプライマリがすでに存在するセカンダリ識別子を保持する場合。したがって、各行はPKまたはUKによって取得できます。 Uniqueはnullを許可しますが、1度だけ許可します(単一のnullを許可するための使用法とは)。

注意:

どちらもクラスター化または非クラスター化することができます。制約を作成するときに、これらのキーに使用するインデックスのタイプを選択できます。

出典:

http://social.msdn.Microsoft.com/Forums/en/transactsql/thread/290619be-b892-4f52-99e0-d8e2ff80aec4

http://bytes.com/topic/sql-server/answers/83999-unique-constraint-vs-unique-index-ms-sql-2000-a

4
user9399

あなたの質問に良い答えを与えるのに十分な情報があるとは思いません。 PK/UIがClusteredであるかNon-Clusteredであるかは、結果の結合にインデックスの一部ではないフィールドが含まれる場合の主要なパフォーマンス係数。

テーブルに一度に存在できるクラスター化インデックスは1つだけです。デフォルトでは、PKはクラスター化されています。ただし、PKが作成される前にクラスター化インデックスが存在した場合、PKは非クラスター化(異常)になります。

したがって、ほとんどの場合、UIはPKの後に作成されるため、UIはクラスター化されないため、結合結果に行の非インデックスフィールドを含める必要がある場合は遅くなります。同様に、PKの代わりにクラスター化されたUIが作成された場合、パフォーマンスはクラスター化されたPKと同等であると予想されます。

「含まれる」列を使用してインデックスを作成することもできます。これにより、クラスター化の問題が回避されます。これにより、結合結果で行を物理的にフェッチする必要なく、含まれる列を使用できるようになります(クラスター化されていない場合、行が別の場所にあるため)。

クラスター化インデックス

インデックス

3
crokusek