web-dev-qa-db-ja.com

クラスタ化インデックスは一意である必要がありますか?

クラスタ化インデックスが一意でない場合はどうなりますか?挿入された行はある種の「オーバーフロー」ページに流れるため、パフォーマンスが低下する可能性がありますか?

それはユニークな「作り」ですか?それをユニークにする最良の方法は何ですか?

私は現在、クラスタ化インデックスを使用してテーブルを論理部分に分割しているので、私は尋ねていますが、パフォーマンスはまあまあで、最近、クラスタ化インデックスを一意にするために アドバイス を得ました。私はそれにセカンドオピニオンが欲しいです。

ありがとう!

75
thomaspaulb

彼らはユニークではありませんがありませんが、それは確かに奨励されています。
一意ではない列にCIを作成したいシナリオはまだありません。

一意でない列にCIを作成する

クラスター化インデックスが一意のインデックスでない場合、SQL Serverは一意の識別子と呼ばれる内部的に生成された値を追加することにより、重複するキーを一意にします

これによりパフォーマンスが低下しますか?

uniqueifierを追加すると、確かに計算と格納にオーバーヘッドが追加されます。
このオーバーヘッドが顕著になるかどうかは、いくつかの要因に依存します。

  • テーブルに含まれるデータの量。
  • 挿入率はいくらですか。
  • 選択でCIが使用される頻度(ほとんどの場合、カバーするインデックスが存在しない場合)。

編集
Remusのコメントで指摘されているように、一意でないCIを作成することが合理的な選択であるユースケースが存在します。これらのシナリオを1つも経験しなかったのは、自分自身の露出や能力の欠如を示しているだけです(選択を選んでください)。

78

私は、インデックス作成の女王、キンバリー・トリップがこのトピックについて何と言っているかをチェックしたい:

いくつかの理由により、クラスタリングキーの推奨から始めます。 1つ目は簡単な決定であり、2つ目は、この決定を早期に行うことで、一部のタイプの断片化を予防的に防ぐのに役立ちます。特定の種類のベーステーブルの断片化を防ぐことができる場合は、一部のメンテナンスアクティビティ(SQL Server 2000では一部、SQL Server 2005では一部)でテーブルをオフラインにする必要があることを最小限に抑えることができます。 OK、後で再構築することになります.....

クラスタ化キーで探す重要なことから始めましょう:

* Unique
* Narrow
* Static

なぜユニークなのですか?クラスタリングキー(存在する場合)は、すべての非クラスター化インデックスからのルックアップキーとして使用されます。たとえば、本の裏にあるインデックスを考えてみましょう-インデックスエントリが指すデータを見つける必要がある場合は、そのエントリ(インデックスエントリ)は一意でなければなりません。どのインデックスエントリが探しているのでしょうか?したがって、クラスター化インデックスを作成するときは、一意でなければなりません。ただし、SQL Serverでは、一意の列にクラスタリングキーを作成する必要はありません。任意の列に作成できます。内部的には、クラスタリングキーが一意でない場合、SQL Serverはデータに4バイトの整数を追加することでそれを「一意化」します。したがって、クラスター化インデックスが一意ではないものに作成された場合、インデックス作成時に追加のオーバーヘッドが発生するだけでなく、ディスクスペースが無駄になり、INSERTおよびUPDATEに追加コストがかかり、SQL Server 2000ではclustereDインデックスに追加コストが発生します再構築(クラスタリングキーの選択が不適切なため、現在はより可能性が高い)。

出典:増加するクラスタリングキーの議論-再び!

25
marc_s

クラスタ化インデックスは一意である必要がありますか?

そうではなく、そうでない方が良い場合もあります。

セミランダムな一意のEmployeeIdと各従業員のDepartmentIdを持つテーブルを考えます。selectステートメントが

SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%

その後、DepartmentIdが一意のインデックスではない場合でも(または特にそうである場合でも)__index_name__がクラスター化インデックスである場合、パフォーマンスに最適です(特定のDepartmentId内のすべてのレコードがクラスター化されるため、パフォーマンスに最適です)。


参考文献はありますか?

Clustered Index Design Guidelines があります。たとえば、

いくつかの例外を除いて、すべてのテーブルには、列で定義されたクラスター化インデックスがあり、以下を提供します。

  • 頻繁に使用されるクエリに使用できます。
  • 高度な一意性を提供します。
  • 範囲クエリで使用できます。

たとえば、「高度な一意性」についての私の理解では、クエリのほとんどが特定の町内のレコードを選択する場合、「国」を選択インデックスとして選択するのは良くないということです。

8
ChrisW