2

SQLServer2005のクラスター化インデックスとは何かを理解するのに苦労しています。私はMSDNの記事ClusteredIndexStructures(とりわけ)を読みましたが、それを正しく理解しているかどうかはまだわかりません。

(主な)質問は次のとおりです。クラスター化インデックスのあるテーブルに(「low」キーを使用して)行を挿入するとどうなりますか?

上記のMSDNの記事には次のように記載されています。

データチェーン内のページとその中の行は、クラスター化インデックスキーの値に基づいて並べ替えられます。

たとえば、クラスター化インデックスを使用すると、次のようになります。

たとえば、順番に並べられたリストの先頭に近いテーブルにレコードが追加された場合、そのレコードの後のテーブル内のレコードは、レコードを挿入できるようにシフトする必要があります。

これは、非常に「低い」キーの行を、すでに数十億行が含まれているテーブルに挿入すると、文字通りすべての行がディスク上で物理的にシフトされることを意味しますか?信じられない。これには何年もかかりますね

それとも(私が思うに)最初のデータページがどれだけ「いっぱい」であるかに応じて2つのシナリオがあるのではないでしょうか。

  • A)ページにレコードを収容するのに十分な空き領域がある場合、そのページは既存のデータページに配置され、データはそのページ内で(物理的に)並べ替えられる可能性があります。
  • B)ページにレコード用の十分な空き領域がない場合、新しいデータページが作成され(ディスク上のどこかに!)、Bツリーのリーフレベルの前面に「リンク」されますか?

これは、データの「物理的な順序」が「ページレベル」(つまり、データページ内)に制限されるが、物理ハードドライブ上の連続するブロックにあるページには制限されないことを意味します。次に、データページが正しい順序でリンクされます。

または、別の方法で定式化されます。SQLServerがクラスター化インデックスを持つテーブルの最初のN行を読み取る必要がある場合、データページを順番に(リンクをたどって)読み取ることができますが、これらのページは(必然的に)ディスク上で順番にブロックされません。(したがって、ディスクヘッドは「ランダムに」移動する必要があります)。

私はどれくらい近いですか?:)

4

2 に答える 2

2

あなたが言うように「低い」IDを持つ行を挿入した場合、はい - 同様のIDを持つすでにそこにある他の行の近くに配置されます。

SQL Server ページ (8K チャンク) がいっぱいになると、ページ分割が発生します。半分の行がそのページに残り、残りの半分が新しいページに移動されます。これら 2 つの新しいページには、新しい行用の容量がいくらかあります。

これが、非常にランダムなクラスタリング キー (GUID など) を使用したくない理由の 1 つです。これにより、行がいたるところに挿入されます。

ページ分割 (非常にコストのかかる操作) を回避しようとすることは、 Kimberly Tripp のような専門家がクラスタリング キーとして増え続けるもの ( INT IDENTITY 列など) を使用することを強く推奨する主な理由の 1 つです。ここでは、新しい値がデータベースに既に存在する値よりも常に大きいことが保証されているため、新しい行は常に食物連鎖の「最後」に追加されます。

優れた背景情報については、Kimberly Tripps のブログ、特に彼女のClustering Keyカテゴリを参照してください。

于 2010-04-28T12:09:25.903 に答える
1

あなたはどれくらい近いですか?とても!

これらの記事は、理解を深めるのに役立ちます。

http://msdn.microsoft.com/en-us/library/aa964133(SQL.90).aspx

http://www.sql-server-performance.com/articles/per/index_fragmentation_p1.aspx

于 2010-04-28T11:56:09.130 に答える