web-dev-qa-db-ja.com

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

clusterednon-clustered indexの違いは何ですか?

259
Eric Labashosky

クラスタ化インデックス

  • テーブルごとに1つだけ
  • データは物理的にインデックス順に格納されているため、クラスタ化されていないよりも読み取りが高速

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

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

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

挿入と更新の速度が遅いため、通常は増分的なフィールド、つまりIdまたはTimestampにはクラスタ化インデックスを設定する必要があります。

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

246
Martynnw

クラスタ化インデックスは、ディスク上のデータを物理的に並べます。これは、インデックスに余分なデータが必要ないことを意味しますが、クラスタ化インデックスは1つしか存在できません(明らかに)。クラスタード・インデックスを使用してデータにアクセスするのが最速です。

他のすべてのインデックスはクラスタ化されていない必要があります。非クラスタ化インデックスには、実際のデータ行へのポインタ(存在する場合は、クラスタ化インデックスへのポインタ)と共に並べられたインデックス付きカラムのデータの複製があります。つまり、非クラスタ化インデックスを介してデータにアクセスするには、追加の間接層を通過する必要があります。ただし、インデックス付きの列で利用可能なデータのみを選択した場合は、複製されたインデックスデータから直接データを取り戻すことができます(必要な列のみをSELECTし、*を使用しないことをお勧めします)

70
rslite

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

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

最善の選択肢は、最も使用頻度の高い一意の列(通常はPK)にクラスター化インデックスを設定することです。非常に説得力のある理由 - 単一のものを考えることができない場合を除き、あなたは常にあなたのテーブルに適切に選択されたクラスタ化インデックスを持つべきです。

32
Santiago Cepas

クラスタ化インデックス

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

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

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

クラスタ化インデックス

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

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

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

これらの違いとは別に、テーブルがクラスタ化されていないとき(テーブルにクラスタ化インデックスがないとき)のデータファイルは順不同で、データ構造としてHeapデータ構造を使用することを知っておく必要があります。

22
Lasitha Yapa

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

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

8
Biri

長所:

クラスタ化インデックスは範囲に対して非常に有効です(例えば、my_keyから@minと@maxの間のmy_tableから*を選択します)。

場合によっては、orderby文を使用するとDBMSがソートの作業をする必要がなくなります。

短所:

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

6
Giovanni Galbo

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

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

5
Josh

クラスタード・インデックスは、本質的にはインデックス付きカラムのデータのソートされたコピーです。

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

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

5
Ed Guiness

索引付きデータベースには、2つの部分があります。任意の順序で配置された一連の物理レコードと、何らかの基準でソートされた結果を得るためにレコードを読み取る順序を識別する一連の索引です。物理的な配置とインデックスの間に相関がない場合は、順番にすべてのレコードを読み取るには、多数の独立した単一レコード読み取り操作を行う必要があります。データベースは、2つの連続していないレコードを読み取るのにかかる時間よりも短時間で何十もの連続したレコードを読み取ることができるため、インデックス内で連続しているレコードも連続してディスクに格納されるとパフォーマンスが向上します。インデックスがクラスタ化されるように指定すると、データベースはインデックス内で連続するレコードのグループがディスク上で連続するように、物事を調整するための何らかの努力をすることになります(データベースによって異なります)。

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

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

5
supercat

あなたは上記の記事から理論の一部を経たかもしれません:

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

- 非クラスタ化インデックスでは、間接的にクラスタ化インデックスを指しているため、実際のレコードにアクセスします。間接的な性質のため、アクセスにはさらに時間がかかります。インデックスを格納するための独自のメモリ/スペースが必要です

enter image description here

0

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

クラスタ化

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

非クラスタ化

  • 非クラスタ化インデックスは、データ行とは別の構造を持ちます。非クラスタ化インデックスには、非クラスタ化インデックスのキー値と
    各キー値エントリには、キー値を含むデータ行へのポインタがあります。
  • 非クラスタ化インデックス内のインデックス行からデータ行へのポインタは、行ロケータと呼ばれます。行ロケータの構造は、データページがヒープに格納されているか、クラスタ化されたテーブルに格納されているかによって異なります。ヒープの場合、行ロケーターはその行へのポインターです。クラスタードテーブルの場合、行ロケーターはクラスタードインデックスキーです。
0
Deepak Mishra