3

「クラスター化インデックスは、クラスター化インデックスキーに基づいてテーブル内のデータを物理的に並べ替える」という人に出くわすことがよくあります。それは真実ではない!次に、そのような投稿は、リンクリストなどを介して実際にどのように保存されるかを説明します。たとえば、この投稿には次のように書かれています

各インデックス行には、キー値と、Bツリーの中間レベルページまたはインデックスのリーフレベルのデータ行へのポインタが含まれています。インデックスの各レベルのページは、二重リンクリストでリンクされています。データチェーン内のページとその行は、クラスター化インデックスキーの値に基づいて並べ替えられます。

それは私の質問に私をもたらします、データページテーブルデータが保存される場所ですよね?したがって、それらが並べ替えられ、その中のデータもインデックス付きの列の値に従って並べ替えられている場合、クラスター化インデックスがテーブルデータを並べ替えられた順序で保持すると言うのはなぜ間違っているのでしょうか。これはKalenDelaneyの本の写真で、CIのあるテーブルのリーフページがすべてCI値に従ってソートされていることを示しています。

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

4

5 に答える 5

6

あなたが正しい。

クラスター化インデックスは、クラスター化インデックスキーに基づいてテーブル内のデータを物理的に並べ替えません。その場合、空き領域のない大きなテーブルの中央に挿入するには、新しいレコード用のスペースを確保するために大量のIOが必要になります。

代わりに、ファイル内のどこからでも新しいページが割り当てられ、リンクリストにリンクされます。

ページの物理的な順序が論理的な順序とどの程度異なるかは、論理的な断片化の程度です。インデックスを再構築または再編成すると、これを減らすことができます。

于 2012-08-31T12:45:07.807 に答える
2

インデックスを作成すると、インデックステーブルも作成されます(名前はよくわかりませんが、インデックス割り当てマップ(IAM)と呼ばれます)。クラスター化インデックスの場合、インデックステーブルにはインデックス列とへのポインタが含まれます。実際の記録。

したがって、テーブルにクラスター化インデックスがある場合、データはテーブル上で物理的にソートされない可能性があります。ディスク内のデータはリンクリストとして維持され、クラスター化インデックスはそのデータへのポインターです。

これで、インデックステーブルは物理的にソートされます...実際のテーブルではありません。インデックステーブルはBツリーとして維持されるため、検索が高速になります。

これで、非クラスター化インデックスを作成すると、クラスター化インデックステーブルを指すようになります

編集: (marc_sが指摘したように)クラスター化インデックスのリーフノードには実際にデータが含まれていますが、非クラスター化インデックスの場合と同様にポインターが含まれています。

しかし、それでも私は信じていません。ディスク内のデータを並べ替えるだけで、ポインタを並べ替えるだけです。

于 2012-08-31T10:49:01.890 に答える
0

クラスタ化インデックスは、インデックスの列ごとにテーブルデータを並べ替えます。新しい各行は、挿入または更新されると、テーブルの適切な場所に配置されます。

これは、非クラスター化インデックスでは発生しません。

于 2012-08-31T10:54:49.643 に答える
0

以下のブログ投稿では、クラスター化インデックスがどのように格納されるかを明確に説明しています。

クラスタ化インデックスは実際に行をキー順に物理的に格納しますか?

于 2015-08-17T11:13:35.213 に答える
-1

ここでの私の元のステートメントは間違っ
ています。インデックスはテーブル内のデータにまったく影響を与えないためです。クラスタ化インデックスは、テーブル内のデータを指す別のタイプのインデックスです。順序を変更したり、データに対して他のことをしたりすることはありません。
(クラスター化または非クラスター化)インデックスを作成する前後に、行番号を使用してテーブルからいつでもデータを直接フェッチできます。
元のステートメントの終わり

修正が必要です(私はMSSQLをあまり使用しないため、これまでテストする機会がありませんでした)
MSSQLは、クラスター化インデックスを実際にはまったくインデックスではなく、トリガーと制約のペアに近いものとして実装しているようです。

今の私の大まかなテストから:

1)

CREATE TABLE testTable ...  
INSERT ... (few rows)  
SELECT * FROM testTable  

これは、すべての結果を挿入順に表示します

2)

CREATE CLUSTERED INDEX ... ON testTable (...); 
INSERT ... (few rows)  
SELECT * FROM testTable  

CLUSTERED INDEX
これは、 3)のフィールド順に並べられたすべての結果を示しています。

DROP INDEX (CLUSTERED INDEX Name) ON testTable;
INSERT ... (few rows)  
SELECT * FROM testTable  

DROP INDEXこれは、ステップ2)[前]のすべての結果を同じ順序で表示し、後で[ステップ3)]に挿入された行を再び挿入順序で表示します。

私にとっては、MSSQL実際のデータレコードを並べ替えることを意味します(挿入/削除に多大なコストがかかる可能性があります)。

それで、私は正直になり、叱責されました。正直なところ、私はこれが当てはまるとは思っていませんでした(クラスター化されたインデックスの動作、私が間違っていると証明されたわけではありません)。

于 2012-08-31T10:48:34.863 に答える