4

私はオンラインで本をトロールし、リーフページ(SQL Server 2000および2005)で物理的にどのフィルファクターが存在するかを調べようとグーグルの呪文を唱えてきました。

インデックスが作成されたときにページに残されたスペースの量は理解していますが、私が見つけていないのは、そのスペースが実際にどのように残されているかです。つまり、ページの終わりに向かって1つの大きなチャンクであるか、そのデータにはいくつかのギャップがあります。

たとえば、[簡単にするために]、ページが100行しか保持できないと仮定します。フィルファクターが75%であると記載されている場合、これは、ページの最初(または最後)の75%がデータであり、残りが空いていることを意味しますか、それとも4行ごとに空いていることを意味します(つまり、ページは次のようになります:データ、データ、データ、無料、データ、データ、データ、無料、...)。

これの長所と短所は、クラスター化されたインデックスを持つテーブルに行を挿入するときに発生する物理操作に関して正確に何が起こるかを把握していることです。挿入は行の最後では発生しません。 。ページ全体に複数のギャップが残っている場合、挿入に対応するために移動する必要のある行数が最小限に抑えられるため、挿入による影響は最小限に抑えられます(少なくともページが分割されるまで)。ギャップがテーブル内の1つの大きなチャンクにある場合、行を調整するためのオーバーヘッドは(少なくとも理論的には)大幅に大きくなります。

誰かがMSDNリファレンスを知っている場合は、それを教えてください!現時点では見つかりません(まだ探しています)。私が読んだことから、それは多くのギャップがあることを意味します-しかし、これは明確に述べられていないようです。

4

2 に答える 2

2

差出人MSDN

フィルファクター設定は、インデックスが作成または再構築された場合にのみ適用されます。はSQL Server Database Engine、ページ内の指定された割合の空きスペースを動的に保持しません。Database Engineデータページの余分なスペースを維持しようとすると、データが入力されるときに各ページのフィルファクターによって指定された空きスペースの割合を維持するためにページ分割を実行する必要があるため、フィルファクターの目的が無効になります。

そしてさらに:

完全なインデックスページに新しい行が追加されるとDatabase Engine、行の約半分が新しいページに移動して、新しい行用のスペースが確保されます。この再編成は、ページ分割と呼ばれます。ページ分割により、新しいレコード用のスペースが確保されますが、実行に時間がかかる可能性があり、リソースを大量に消費する操作になります。また、断片化が発生し、I/O操作が増える可能性があります。ページ分割が頻繁に発生する場合は、新規または既存の曲線因子値を使用してデータを再配布することにより、インデックスを再構築できます。

SQL Serverのデータページは、次の要素で構成されています。

  • Page header96バイト、修正済み。
  • Data: 変数
  • Row offset array: 変数。

行オフセット配列は常にページの最後に格納され、後方に大きくなります。

配列の各要素は2、ページ内の各行の先頭へのオフセットを保持する-byte値です。

行はデータページ内で順序付けられません。代わりに、行の順序(クラスター化ストレージの場合)は行オフセット配列によって決定されます。ソートされるのは行オフセットです。

たとえば、クラスターキー値がの100バイト行をクラスター10化されたテーブルに挿入し、それが空きページに入ると、次のように挿入されます。

[00   - 95   ]   Header
[96   - 195  ]   Row 10
[196  - 8190 ]   Free space
[8190 - 8191 ]   Row offset array: [96]

次に、同じページに新しい行を挿入します。今回は、クラスターキーの値は次の9とおりです。

[00   - 95   ]   Header
[96   - 195  ]   Row 10
[196  - 295  ]   Row 9
[296  - 8188 ]   Free space
[8188 - 8191 ]   Row offset array: [196] [96]

行は論理的に付加されますが、物理的に付加されます。

オフセット配列は、行の論理的な順序を反映するように並べ替えられます。

これを考えると、行がページの最初から空きスペースに追加され、行へのポインタがページの最後から空きスペースに追加されていることが簡単わかります。

于 2009-09-02T13:12:44.897 に答える
0

私がこれを考えたのはこれが初めてであり、私は結論について前向きではありませんが、

1回の読み取りIOでSQLServerが取得できるデータの最小量は、データの1ページ全体であるため、最初に1ページ内の行を並べ替える必要があるのはなぜですか。そうではないのではないかと思います。そのため、最後にギャップがすべて1つの大きなギャップにある場合でも、それが正しい並べ替え順序であるかどうかに関係なく、最後に新しいレコードを追加できます。(そもそもページ上のレコードを並べ替える理由がない場合)

そして、次に、IOの書き込み側について考えると、最小の書き込みチャンクもページ全体であると思います(最小の変更でも、ページ全体をディスクに書き戻す必要があります)。これは、ページが書き込まれるたびにページ上のすべての行がメモリ内で並べ替えられる可能性があることを意味します。したがって、単一ページの並べ替えられた行のセットの先頭に挿入した場合でも、ページ全体が読み取られます。新しいレコードをメモリ内のセットの適切なスロットに挿入すると、並べ替えられた新しいページ全体がディスクに書き戻されます...

于 2009-09-02T13:10:13.587 に答える