87

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

それは「作られた」ユニークなものですか?もしそうなら、どのように?それをユニークにするための最良の方法は何ですか?

現在、クラスター化インデックスを使用してテーブルを論理部分に分割しているので質問していますが、パフォーマンスはまあまあで、最近、クラスター化インデックスを一意にするようアドバイスを受けました。それについてセカンドオピニオンをお願いします。

4

3 に答える 3

96

それらは一意である必要はありません、確かに推奨されます。
一意でない列にCIを作成したいというシナリオはまだ発生していません。

一意でない列にCIを作成するとどうなりますか

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

これはパフォーマンスの低下につながりますか?

一意化子を追加すると、計算と保存にある程度のオーバーヘッドが確実に追加されます。
このオーバーヘッドが目立つかどうかは、いくつかの要因によって異なります。

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


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

于 2010-12-02T08:25:27.630 に答える
32

インデックス作成の女王、キンバリー・トリップがこのトピックについて何と言っているかを確認したいと思います。

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

クラスタリングキーで私が探す重要なことから始めましょう:

* Unique
* Narrow
* Static

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

出典: ますます増え続けるクラスタリングの重要な議論-再び!

于 2010-12-02T09:19:13.977 に答える
9

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

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

半ランダムで一意のEmployeeIdと、各従業員のDepartmentIdを持つテーブルについて考えてみます。selectステートメントが

SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%

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


参考文献はありますか?

たとえば、クラスター化されたインデックスの設計ガイドラインがあります。

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

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

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

于 2010-12-02T08:48:36.257 に答える