a clustered
とaの違いは何non-clustered index
ですか?
a clustered
とaの違いは何non-clustered index
ですか?
回答:
クラスター化インデックス
非クラスター化インデックス
どちらのタイプのインデックスでも、インデックスを使用するフィールドを持つデータを選択するときにパフォーマンスが向上しますが、更新および挿入操作が遅くなります。
挿入と更新が遅いため、通常はインクリメンタルなフィールド(IdまたはTimestamp)にクラスター化インデックスを設定する必要があります。
SQL Serverは通常、選択性が95%を超える場合にのみインデックスを使用します。
クラスター化インデックスは、ディスク上のデータを物理的に並べます。つまり、インデックスに追加のデータは必要ありませんが、クラスター化インデックスは(当然)1つしか存在できません。クラスター化インデックスを使用したデータへのアクセスが最も高速です。
他のすべてのインデックスは非クラスター化である必要があります。非クラスター化インデックスには、実際のデータ行へのポインター(存在する場合はクラスター化インデックスへのポインター)と一緒に順序付けされたインデックス付き列からのデータの複製があります。これは、非クラスター化インデックスを介してデータにアクセスする場合は、追加の間接層を経由する必要があることを意味します。ただし、インデックス付きの列で利用可能なデータのみを選択した場合は、複製されたインデックスデータから直接データを取得できます(そのため、必要な列のみを選択し、*を使用しないことをお勧めします)。
クラスタ化インデックスは物理的にテーブルに格納されます。つまり、それらは最速であり、テーブルごとに1つのクラスター化インデックスしか持つことができません。
非クラスター化インデックスは個別に格納され、必要な数だけ持つことができます。
最適なオプションは、最もよく使用される一意の列(通常はPK)にクラスター化インデックスを設定することです。非常に説得力のある理由が1つとは考えられない場合を除いて、常に適切に選択されたクラスター化インデックスがテーブルに存在する必要があります。
これらの違いは別として、テーブルがクラスター化されていない場合(テーブルにクラスター化インデックスがない場合)のデータファイルは順序付けされておらず、データ構造としてヒープデータ構造を使用することを知っておく必要があります。
インデックス付きデータベースには2つの部分があります。任意の順序で配置された物理レコードのセットと、何らかの基準でソートされた結果を生成するためにレコードを読み取る順序を識別するインデックスのセットです。物理的な配置とインデックスの間に相関関係がない場合、すべてのレコードを順番に読み取るには、多数の独立した単一レコードの読み取り操作を行う必要がある場合があります。データベースは、連続しない2つのレコードを読み取るよりも短い時間で数十の連続するレコードを読み取ることができるため、インデックスで連続するレコードもディスクに連続して格納されている場合、パフォーマンスが向上する可能性があります。
たとえば、空の非クラスター化データベースから始めて、ランダムな順序で10,000レコードを追加する場合、レコードは追加された順序で最後に追加される可能性があります。インデックス順にデータベースを読み取るには、1レコードの読み取りが10,000回必要です。ただし、クラスタ化されたデータベースを使用する場合、システムは各レコードを追加するときに、前のレコードが単独で格納されているかどうかをチェックする場合があります。それが事実であることが判明した場合、データベースの最後に新しいレコードでそのレコードを書き込む可能性があります。次に、移動されたレコードが常駐していたスロットの前の物理レコードを調べて、それに続くレコードが単独で格納されているかどうかを確認します。それが事実であることがわかった場合、そのレコードをその場所に移動することができます。このようなアプローチを使用すると、多くのレコードがペアでグループ化され、
実際には、クラスター化されたデータベースはこれよりも高度なアルゴリズムを使用します。ただし、注意すべき重要な点は、データベースの更新に必要な時間とシーケンシャルな読み取りに必要な時間の間にトレードオフがあることです。クラスター化されたデータベースを維持すると、並べ替え順序に影響を与えるような方法でレコードを追加、削除、または更新するために必要な作業量が大幅に増加します。データベースが更新されるよりもずっと頻繁にシーケンシャルに読み取られる場合、クラスタリングは大きなメリットになる可能性があります。頻繁に更新されるが、順番に読み取られることはめったにない場合、特に、項目がデータベースに追加される順序がクラスター化インデックスに関するソート順とは無関係である場合、クラスタリングはパフォーマンスの大きな浪費になる可能性があります。
あなたは上記の投稿から理論の部分を通過したかもしれません:
-クラスター化されたインデックスは、直接記録するためのポイント、つまりその直接を見ることができるため、検索にかかる時間を短縮できます。さらに、インデックスを保存するために余分なメモリ/スペースを必要としません
-非クラスター化インデックスでは、間接的にクラスター化インデックスをポイントし、その後、実際のレコードにアクセスしますが、間接的な性質のため、アクセスするのにいくらか時間がかかります。また、インデックス
// MSDNからコピーした非クラスター化インデックスの2番目のポイントは、他の回答では明確に言及されていません。
クラスター化
非クラスター化