クラスター化インデックスと非クラスター化インデックスの違いは何ですか?


277

a clusteredとaの違いは何non-clustered indexですか?


8
テーブルごとに1つのクラスター化インデックスしか持てません。しかし、他にも多くの違いがあります...
トムロビンソン

5
クラスタ化インデックスは、実際にはレコードがディスクに物理的に格納される順序を示します。したがって、1つしか持てない理由です。非クラスター化インデックスは、ディスク上の物理的な順序と一致しない論理的な順序を定義します。
ジョシュ

1
基本的にクラスター化とは、データがテーブル内でその物理的な順序になっていることを意味します。これが、テーブルごとに1つしか持てない理由です。クラスター化されていないということは、論理的な順序が「唯一」であることを意味します。
Biri、

2
@biri「論理」順序とは何ですか?非クラスター化インデックスは、物理的に順番にインデックスキーを格納し、テーブルへのポインター、つまりクラスター化インデックスキーを格納します。
ステファニーページ

@Stephanieページ:テーブルの観点からは論理的です。もちろん、非クラスター化インデックスは、インデックス自体の中で物理的に並べられます。
Biri

回答:


268

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

  • テーブルごとに1つのみ
  • データは物理的にインデックス順に保存されるため、非クラスター化よりも読み取りが高速

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

  • テーブルごとに何度も使用できます
  • クラスター化インデックスよりも挿入および更新操作が高速

どちらのタイプのインデックスでも、インデックスを使用するフィールドを持つデータを選択するときにパフォーマンスが向上しますが、更新および挿入操作が遅くなります。

挿入と更新が遅いため、通常はインクリメンタルなフィールド(IdまたはTimestamp)にクラスター化インデックスを設定する必要があります。

SQL Serverは通常、選択性が95%を超える場合にのみインデックスを使用します。


9
ストレージに関する考慮事項もあります。クラスタ化インデックスのないテーブルに行を挿入する場合、行はページに連続して格納され、行を更新すると、行がテーブルの最後に移動され、空のスペースが残り、テーブルとインデックスが断片化されます。
エレミヤペシュカ

4
xが何であるかを気にする必要はありません。知っておく必要があるのは、数百万人のユーザーがいるアプリの場合、xが重要になることです
Pacerier

14
それは純粋にドグマです。「データが順番に保存されているため、読み取りが高速」ではありません。インデックスの読み取りとテーブルの読み取りを回避できるため、読み取りが高速になります。データが順番に保存されるため、(意味がある場合は)範囲スキャンの方が高速です。つまり、クラスタリング係数は完璧です。
ステファニーページ

6
また、レコードの95%は一意である必要があるという考えは誤りです。1,000,000行のテーブルがあり、500,000キーの列にインデックスを作成するとします。0%は一意ですが、各キーは100万行のうち2行を返します。このインデックスは、レコードの0%が一意であるかどうかに関係なく、非常に役立ちます。
ステファニーページ

2
「データは物理的にインデックス順に保存されます」それはどういう意味ですか?あるレベルでは、データページとインデックスリーフページがまったく同じであるため、それは自明です。つまり、一方の順序が他方の順序を表すことは明らかです。しかし、これは、このようなインデックスキーの順序として、特定の順序である必要はないstackoverflow.com/questions/1251636/...
マーティン・スミス

79

クラスター化インデックスは、ディスク上のデータを物理的に並べます。つまり、インデックスに追加のデータは必要ありませんが、クラスター化インデックスは(当然)1つしか存在できません。クラスター化インデックスを使用したデータへのアクセスが最も高速です。

他のすべてのインデックスは非クラスター化である必要があります。非クラスター化インデックスには、実際のデータ行へのポインター(存在する場合はクラスター化インデックスへのポインター)と一緒に順序付けされたインデックス付き列からのデータの複製があります。これは、非クラスター化インデックスを介してデータにアクセスする場合は、追加の間接層を経由する必要があることを意味します。ただし、インデックス付きの列で利用可能なデータのみを選択した場合は、複製されたインデックスデータから直接データを取得できます(そのため、必要な列のみを選択し、*を使用しないことをお勧めします)。


3
「ただし、インデックス付けされた列で使用可能なデータのみを選択した場合、複製されたインデックスデータから直接データを取得できます」-これは、優先クラスター化インデックスヒューリスティックの重要な例外です。この場合、クラスター化インデックスは基本的にあると思いますが、クエリしているテーブルのデータが少ないため、ディスクから高速に読み取ることができます。
satnhak 2012

34

クラスタ化インデックスは物理的にテーブルに格納されます。つまり、それらは最速であり、テーブルごとに1つのクラスター化インデックスしか持つことができません。

非クラスター化インデックスは個別に格納され、必要な数だけ持つことができます。

最適なオプションは、最もよく使用される一意の列(通常はPK)にクラスター化インデックスを設定することです。非常に説得力のある理由が1つとは考えられない場合を除いて、常に適切に選択されたクラスター化インデックスがテーブルに存在する必要があります。


3
「テーブルには常にクラスター化インデックスが必要です」について詳しく説明できますか?詳細については述べないが、その言葉は常に
Pacerier

1
あなたは正しいパチェリエです。絶対的な声明を軽く使うべきではありません。十分に選択されたクラスター化インデックスを使用するべきでない単一のケースは知りませんが、そのようなケースが存在する可能性があるため、より一般的なバージョンに回答を変更しました。
サンティアゴセパス2011

28

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

  1. テーブルのクラスター化インデックスは1つだけです。
  2. 通常は主キーに対して行われます。
  3. クラスタ化インデックスのリーフノードには、データページが含まれています。

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

  1. テーブルの非クラスター化インデックスは249のみです(SQLバージョン2005以降のバージョンでは最大999の非クラスター化インデックスがサポートされるまで)。
  2. 通常、任意のキーで作成されます。
  3. 非クラスター化インデックスのリーフノードは、データページで構成されていません。代わりに、リーフノードにはインデックス行が含まれます。

24

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

  • テーブルに存在できるクラスタ化インデックスは1つだけです
  • レコードを並べ替えて、順序に従って物理的に保存する
  • データの取得は、非クラスター化インデックスよりも高速です
  • 論理構造を保存するために余分なスペースは必要ありません

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

  • テーブルには任意の数の非クラスター化インデックスを含めることができます
  • 物理的な順序には影響しません。データ行の論理的な順序を作成し、物理データファイルへのポインターを使用する
  • データの挿入/更新は、クラスター化インデックスよりも高速です
  • 余分なスペースを使用して論理構造を保存する

これらの違いは別として、テーブルがクラスター化されていない場合(テーブルにクラスター化インデックスがない場合)のデータファイルは順序付けされておらず、データ構造としてヒープデータ構造を使用することを知っておく必要があります。


10

基本的にクラスター化とは、データがテーブル内でその物理的な順序になっていることを意味します。これが、テーブルごとに1つしか持てない理由です。

クラスター化されていないということは、それが「唯一の」論理的な順序であることを意味します。


9

長所:

クラスター化インデックスは範囲に適しています(たとえば、select * from my_table where my_key between @min and @max)

状況によっては、orderbyステートメントを使用する場合、DBMSはソートする作業を行う必要がなくなります。

短所:

新しいキーが順番に並んでいない場合、レコードが挿入されるときにレコードの物理レイアウトを変更する必要があるため、クラスター化インデックスは挿入を遅くする可能性があります。


6

クラスター化インデックスは、本質的に、インデックス付けされた列のデータのソートされたコピーです。

クラスター化インデックスの主な利点は、クエリ(シーク)がインデックス内のデータを見つけたときに、そのデータを取得するために追加のIOが必要ないことです。

特に頻繁に更新されるテーブルでクラスター化インデックスを維持するオーバーヘッドは、パフォーマンスの低下につながる可能性があるため、非クラスター化インデックスを作成することをお勧めします。


6

インデックス付きデータベースには2つの部分があります。任意の順序で配置された物理レコードのセットと、何らかの基準でソートされた結果を生成するためにレコードを読み取る順序を識別するインデックスのセットです。物理的な配置とインデックスの間に相関関係がない場合、すべてのレコードを順番に読み取るには、多数の独立した単一レコードの読み取り操作を行う必要がある場合があります。データベースは、連続しない2つのレコードを読み取るよりも短い時間で数十の連続するレコードを読み取ることができるため、インデックスで連続するレコードもディスクに連続して格納されている場合、パフォーマンスが向上する可能性があります。

たとえば、空の非クラスター化データベースから始めて、ランダムな順序で10,000レコードを追加する場合、レコードは追加された順序で最後に追加される可能性があります。インデックス順にデータベースを読み取るには、1レコードの読み取りが10,000回必要です。ただし、クラスタ化されたデータベースを使用する場合、システムは各レコードを追加するときに、前のレコードが単独で格納されているかどうかをチェックする場合があります。それが事実であることが判明した場合、データベースの最後に新しいレコードでそのレコードを書き込む可能性があります。次に、移動されたレコードが常駐していたスロットの前の物理レコードを調べて、それに続くレコードが単独で格納されているかどうかを確認します。それが事実であることがわかった場合、そのレコードをその場所に移動することができます。このようなアプローチを使用すると、多くのレコードがペアでグループ化され、

実際には、クラスター化されたデータベースはこれよりも高度なアルゴリズムを使用します。ただし、注意すべき重要な点は、データベースの更新に必要な時間とシーケンシャルな読み取りに必要な時間の間にトレードオフがあることです。クラスター化されたデータベースを維持すると、並べ替え順序に影響を与えるような方法でレコードを追加、削除、または更新するために必要な作業量が大幅に増加します。データベースが更新されるよりもずっと頻繁にシーケンシャルに読み取られる場合、クラスタリングは大きなメリットになる可能性があります。頻繁に更新されるが、順番に読み取られることはめったにない場合、特に、項目がデータベースに追加される順序がクラスター化インデックスに関するソート順とは無関係である場合、クラスタリングはパフォーマンスの大きな浪費になる可能性があります。


5

クラスタ化インデックスは、実際にはレコードがディスクに物理的に格納される順序を説明するため、1つしか持てない理由です。

非クラスター化インデックスは、ディスク上の物理的な順序と一致しない論理的な順序を定義します。


2

あなたは上記の投稿から理論の部分を通過したかもしれません:

-クラスター化されたインデックスは、直接記録するためのポイント、つまりその直接を見ることができるため、検索にかかる時間を短縮できます。さらに、インデックスを保存するために余分なメモリ/スペースを必要としません

-非クラスター化インデックスでは、間接的にクラスター化インデックスをポイントし、その後、実際のレコードにアクセスしますが、間接的な性質のため、アクセスするのにいくらか時間がかかります。また、インデックス

ここに画像の説明を入力してください


0

// MSDNからコピーした非クラスター化インデックスの2番目のポイントは、他の回答では明確に言及されていません。

クラスター化

  • クラスター化インデックスは、キー値に基づいてテーブルまたはビューのデータ行を並べ替えて格納します。これらは、インデックス定義に含まれる列です。データ行自体は1つの順序でしか格納できないため、テーブルごとにクラスター化インデックスは1つしか存在できません。
  • テーブル内のデータ行が並べ替えられた順序で格納されるのは、テーブルにクラスター化インデックスが含まれている場合のみです。テーブルにクラスター化インデックスがある場合、そのテーブルはクラスター化テーブルと呼ばれます。テーブルにクラスター化インデックスがない場合、そのデータ行はヒープと呼ばれる順序付けられていない構造に格納されます。

非クラスター化

  • 非クラスター化インデックスは、データ行とは別の構造を持っています。非クラスター化インデックスには非クラスター化インデックスのキー値が含まれ、
    各キー値エントリには、キー値を含むデータ行へのポインターがあります。
  • 非クラスター化インデックスのインデックス行からデータ行へのポインターは、行ロケーターと呼ばれます。行ロケーターの構造は、データページがヒープに格納されているか、クラスター化されたテーブルに格納されているかによって異なります。ヒープの場合、行ロケータは行へのポインタです。クラスター化テーブルの場合、行ロケーターはクラスター化インデックスキーです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.