2012-04-15 22 views
5

私はOracleのバックグラウンドを持っており、すべてのテーブルに「索引構成表」(IOT)を使用すると、Oracleでは不合理に聞こえます。 SQL Serverでは、私が取り組んだデータベースはすべて、IOT(概念的には)と同じ、すべてのテーブルにクラスタ化されたインデックスを持っています。クラスタ化インデックスSQL Server

なぜですか?どこでもクラスタ化インデックスを使用する理由はありますか?少数のケースにしか役に立たないように私には思える。私たちは、リレーショナル・データベースにし、一般的な関係で主キーを使用している

おかげ

+4

[DBA-SE](http://dba.stackexchange.com/)に関するいくつかの情報といくつかのリンクがあります。 [クラスタ化されたインデックスに対するヒープ上の非クラスタ化インデックスのパフォーマンス](http://dba.stackexchange.com/questions/9829/performance-of-non-clustered-indexes-on-heaps-vs-clustered-indexes) –

+4

おそらくa質問は、OracleとSQL Serverの両方に精通している人が最もよく答えます。 [dba.se]はこれに適した場所です。 –

+1

また、この質問をd​​ba.seに移動することをお勧めします。実際にクラスタ化された索引やIOTを実際に取り上げている他のポスターがないと、DBA.SEのレギュラーから2つのコメントと(まったく偶然の)回答がありました。実際には大きな違いがあります。 – ConcernedOfTunbridgeWells

答えて

2

クラスタ化インデックスがない場合、テーブルはヒープとして編成されます。つまり、挿入されているすべての行が、表の最後のデータページに追加されます。また、行が更新されると、更新されたデータが以前よりも大きければ、表の最後のデータページに移動します。

あなたが最速の挿入を必要とするテーブルを持っていますが、更新を犠牲にし、スピードを読み取ることができ、その後、クラスタ化インデックスは、のために働くことがない場合は、クラスタ化インデックス

を持っていないのは良いです君は。 1つの例は、キューとして使用されていたテーブルがある場合です。たとえば、多くの挿入が後で読み込まれて別のテーブルに移動されるなどです。

クラスタ化インデックス

クラスタ化インデックスは、クラスタ化インデックスの列に基づいて、テーブル内のデータを整理します。あなたがユニークな識別子のように間違ったことをすると、これは物事を遅くすることができます(下記参照)。

クラスタ化インデックスが検索に最も一般的に使用される値であり、一意であり、それらを増やすと、クラスター化インデックスのパフォーマンスが向上します。たとえば、USER_IDに基づいてユーザーデータを検索するUSERSというテーブルがある場合、USER_IDでクラスタリングすると、すべてのルックアップのパフォーマンスが向上します。これにより、データを読み込むために必要なデータページの数が単純に削減されます。

クラスタ化インデックスにキーが多すぎると、状況が遅くなる可能性があります。クラスタ化インデックスの

一般規則:

は、任意のvarchar列にクラスタ化しないでください。

通常、INT IDENTITY列でのクラスタリングが最適です。

あなたが一般的に検索しているものに集中してください。インデックス内のuniqueidentifiersでUniqueIdentifiers

クラスタリング全く自然なソート順がないため、彼らは非常に非効率的です。索引のbツリー構造に基づいて、uniqueidentifierを使用するときわめて断片化された索引が作成されます。再構築または再編成後、それらは依然として非常に細分化されています。だから、インデックスが遅くなり、断片化のためにメモリとディスクに膨大な量になってしまいます。また、uniqueidentifierの挿入時には、インデックス上のページ分割によって結局挿入が遅くなる可能性が高くなります。一般的に、uniqueidentifierはインデックスの悪いニュースです。

まとめ

私の推薦はない(キューとして機能すなわちテーブル)には本当に十分な理由がある場合を除き、すべての表がそれにクラスタ化インデックスを持つべきであるということです。

+0

これは、クラスタード・インデックスの理解を確認します。私はルックアップテーブルに有限数の行を持つインデックスを持つことを理解できます。請求書に適合します。基本的には、成長し続け、挿入されると自然に順序付けされるファクトテーブルのヒープです。常に私を困惑させたのは、あなたが "UniqueIdentifiersのクラスタリング"で説明したものです。私は2B行のテーブルにあるデータベースの1つを継承しました。それは私にとって意味をなさない!それに加えて、それを再構築するための自動化された仕事がありました。おかげさまで、多くのことが始まりました。 – Younes

0

は、これらの主キーを介して確立されます。ほとんどの人は、TableIDとして最初のフィールドに名前を付けてそれを主キーにしていました。クエリで2つ以上のテーブルを結合すると、クラスタ化インデックスを使用すると最も速く結果が得られます。

1

ほとんどの場合、クラスタ化インデックスよりもヒープを好む理由はわかりません。クラスタリングを使用すると、自由に1つの索引を選択できます。ほとんどの場合、これはプライマリキーです(これはおそらく実行する必要があります)。

ほとんどの場合、特殊な状況のためです。

6

クラスタ化インデックスは、インデックス構成テーブルとまったく同じものではありません。 IOTでは、すべてのフィールドがIOTキーに参加しなければなりません。 SQL Serverのクラスタード・インデックスは一意である必要はなく、主キーである必要はありません。

一般的に使用されるクエリをより効率的にする自然な順序付けがほとんど存在するため、クラスタ化インデックスはSQL Serverで広く使用されています。オラクルのIOTはより多くの手荷物を運ぶので、一般的に信用されているほうが便利かもしれませんが、それほど有用ではありません。

以前のSQL Server 6.5より前のバージョンまたは7.0 IIRCでは、行レベルのロックがサポートされておらず、テーブルまたはページレベルでしかロックできませんでした。多くの場合、ページロックに対する競合を最小限に抑えるために、クラスタ化インデックスを使用して、書き込みがテーブルの物理ストレージに散在するようにします。しかし、SQL Server 6は数年前にサポートを受けていたため、この問題のあるアプリケーションはまれなレガシーシステムに限定されていました。

+0

私は一般にディメンションテーブル(小さなテーブル)でクラスタードインデックスを気にしません。実際のテーブルでは、私はそれが良いアイデアであるとは確信していません、それは読み込みを遅くし、完全なスキャン。ほとんどの場合、自然順序付けは時間ベースであり、一般にデータがロードされた順序です。 – Younes

+1

@Younes - クラスタ化されたインデックスは、ほとんどのクエリでテーブルスキャンが行われるため、ファクトテーブルではあまり役に立ちません。おそらく、パーティション化をサポートしないバージョン(たとえば、2012 B.I. edition)では、日付または期間の列にクラスタードインデックスを使用して、ロードまたはアーカイブ操作のI/Oを最小限に抑えることができます。日付範囲のクエリでは、範囲スキャン操作を使用してクラスタードインデックスを使用してI/Oを削減することもできます。 – ConcernedOfTunbridgeWells

関連する問題