次の方法で共有


非クラスター化インデックスのサイズを見積もる

非クラスター化インデックスを格納するために必要な領域の量を見積もるために、次の手順に従います。

  1. 手順 2 と 3 で使用する変数を計算します。

  2. 非クラスター化インデックスのリーフ レベルにインデックス情報を格納するために使用される領域を計算します。

  3. 非クラスター化インデックスの非リーフ レベルにインデックス情報を格納するために使用される領域を計算します。

  4. 計算値の合計。

ステップ 1. 手順 2 および 3 で使用する変数を計算する

次の手順を使用して、インデックスの上位レベルを格納するために必要な領域の量を見積もるために使用される変数を計算できます。

  1. テーブルに存在する行の数を指定します。

    Num_Rows = テーブル内の行数

  2. インデックス キーに固定長列と可変長列の数を指定し、そのストレージに必要な領域を計算します。

    インデックスのキー列には、固定長列と可変長列を含めることができます。 内部レベルのインデックス行のサイズを見積もるために、これらの列の各グループがインデックス行内で占める領域を計算します。 列のサイズは、データ型と長さの指定によって異なります。

    Num_Key_Cols = キー列の合計数 (固定長および可変長)

    Fixed_Key_Size = すべての固定長キー列の合計バイト サイズ

    Num_Variable_Key_Cols = 可変長キー列の数

    Max_Var_Key_Size = すべての可変長キー列の最大バイト サイズ

  3. インデックスが一意でない場合に必要なデータ行ロケーターを考慮します。

    非クラスター化インデックスが一意でない場合、データ行ロケーターは非クラスター化インデックス キーと組み合わされ、すべての行に一意のキー値が生成されます。

    非クラスター化インデックスがヒープ上にある場合、データ行ロケーターはヒープ RID です。 これは 8 バイトのサイズです。

    Num_Key_Cols = Num_Key_Cols + 1

    Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1

    Max_Var_Key_Size = Max_Var_Key_Size + 8

    非クラスター化インデックスがクラスター化インデックス上にある場合、データ行ロケーターはクラスタリング キーです。 非クラスター化インデックス キーと組み合わせる必要がある列は、クラスター化キー内の列であり、非クラスター化インデックス キー列のセットにまだ存在しません。

    Num_Key_Cols = Num_Key_Cols + 非クラスター化インデックス キー列のセットに含まれていないクラスタリング キー列の数 (クラスター化インデックスが一意でない場合は + 1)

    Fixed_Key_Size = Fixed_Key_Size + 非クラスター化インデックス キー列のセットに含まれていない固定長クラスタリング キー列の合計バイトサイズ

    Num_Variable_Key_Cols = Num_Variable_Key_Cols + 非クラスター化インデックス キー列のセットにない可変長クラスタリング キー列の数 (クラスター化インデックスが一意でない場合は + 1)

    Max_Var_Key_Size = Max_Var_Key_Size + 非クラスター化インデックス キー列のセットにない可変長クラスタリング キー列の最大バイト サイズ (クラスター化インデックスが一意でない場合は+ 4)

  4. null ビットマップと呼ばれる行の一部は、列の null 許容を管理するために予約されている可能性があります。 そのサイズを計算します。

    手順 1.3 の説明に従って必要なクラスタリング キー列を含め、インデックス キーに null 許容列がある場合、インデックス行の一部は null ビットマップ用に予約されます。

    Index_Null_Bitmap = 2 + ((インデックス行の列数 + 7) / 8)

    前の式の整数部分のみを使用する必要があります。 剰余を破棄します。

    null 許容キー列がない場合は、 Index_Null_Bitmap を 0 に設定します。

  5. 可変長データ サイズを計算します。

    必要なクラスター化インデックス キー列を含め、インデックス キーに可変長列がある場合は、インデックス行内の列を格納するために使用される領域の量を決定します。

    Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size

    Max_Var_Key_Sizeに追加されるバイト数は、各変数列を追跡するためです。この数式では、すべての可変長列が 100% 満杯であることを前提としています。 可変長列ストレージ領域の割合が小さいと予想される場合は、その割合で Max_Var_Key_Size 値を調整して、テーブル全体のサイズをより正確に見積もることができます。

    可変長列がない場合は、 Variable_Key_Size を 0 に設定します。

  6. インデックス行のサイズを計算します。

    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (インデックス行の行ヘッダー オーバーヘッドの場合) + 6 (子ページ ID ポインターの場合)

  7. ページあたりのインデックス行数を計算します (1 ページあたり 8,096 バイトの空きバイト)。

    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

    インデックス行はページにまたがらないため、1ページあたりのインデックス行数は最も近い整数に切り捨てる必要があります。 数式の 2 は、ページのスロット配列内の行のエントリ用です。

手順 2. リーフ レベルにインデックス情報を格納するために使用される領域を計算する

次の手順を使用して、インデックスのリーフ レベルを格納するために必要な領域の量を見積もることができます。 この手順を完了するには、手順 1 の値を保持する必要があります。

  1. リーフ レベルで固定長列と可変長列の数を指定し、そのストレージに必要な領域を計算します。

    インデックス キー列に加えて非キー列を含めることで、非クラスター化インデックスを拡張できます。 これらの追加列は、非クラスター化インデックスのリーフ レベルでのみ格納されます。 詳細については、「 付加列インデックスの作成」を参照してください。

    定義されたテーブルの幅の合計が 8,060 バイトを超える varcharnvarcharvarbinary、または sql_variant の列を組み合わせることができます。 これらの各列の長さは、 varcharvarbinary、または sql_variant 列の場合は 8,000 バイト、 nvarchar 列の場合は 4,000 バイトの制限内に収める必要があります。 ただし、組み合わされた幅は、テーブル内の 8,060 バイトの制限を超える可能性があります。 これは、列を含む非クラスター化インデックスリーフ行にも適用されます。

    非クラスター化インデックスに含まれる列がない場合は、手順 1.3 で決定した変更を含む手順 1 の値を使用します。

    Num_Leaf_Cols = Num_Key_Cols

    固定リーフサイズ = 固定キーサイズ

    Num_Variable_Leaf_Cols = Num_Variable_Key_Cols

    Max_Var_Leaf_Size = Max_Var_Key_Size

    非クラスター化インデックスに列が含まれている場合は、手順 1.3 の変更を含め、手順 1 の値に適切な値を追加します。 列のサイズは、データ型と長さの指定によって異なります。 詳細については、「 データ型 (Transact-SQL)」を参照してください。

    Num_Leaf_Cols = Num_Key_Cols + 含まれる列の数

    Fixed_Leaf_Size = Fixed_Key_Size + 固定長に含まれる列の合計バイト サイズ

    Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + 可変長に含まれる列の数

    Max_Var_Leaf_Size = Max_Var_Key_Size + 可変長に含まれる列の最大バイト サイズ

  2. データ行ロケーターを考慮する。

    非クラスター化インデックスが一意でない場合、データ行ロケーターのオーバーヘッドは手順 1.3 で既に考慮されており、追加の変更は必要ありません。 次の手順に進みます。

    非クラスター化インデックスが一意の場合は、リーフ レベルのすべての行でデータ行ロケーターを考慮する必要があります。

    非クラスター化インデックスがヒープ上にある場合、データ行ロケーターはヒープ RID (サイズ 8 バイト) です。

    Num_Leaf_Cols = Num_Leaf_Cols + 1

    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 1

    Max_Var_Leaf_Size = Max_Var_Leaf_Size + 8

    非クラスター化インデックスがクラスター化インデックス上にある場合、データ行ロケーターはクラスタリング キーです。 非クラスター化インデックス キーと組み合わせる必要がある列は、クラスター化キー内の列であり、非クラスター化インデックス キー列のセットにまだ存在しません。

    Num_Leaf_Cols = Num_Leaf_Cols + 非クラスター化インデックス キー列のセットにないクラスタリング キー列の数 (クラスター化インデックスが一意でない場合は + 1)

    Fixed_Leaf_Size = Fixed_Leaf_Size + 非クラスター化インデックス キー列のセットにない固定長クラスタリング キー列の数

    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 非クラスター化インデックス キー列のセットにない可変長クラスタリング キー列の数 (クラスター化インデックスが一意でない場合は + 1)

    Max_Var_Leaf_Size = Max_Var_Leaf_Size + 非クラスター化インデックス キー列のセットにない可変長クラスタリング キー列のバイト単位のサイズ (クラスター化インデックスが一意でない場合は + 4)

  3. null ビットマップ サイズを計算します。

    Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)

    前の式の整数部分のみを使用する必要があります。 剰余を破棄します。

  4. 可変長データ サイズを計算します。

    手順 2.2 で説明したように、必要なクラスタリング キー列を含め、インデックス キーに可変長列がある場合は、インデックス行内に列を格納するために使用される領域の量を決定します。

    Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols x 2) + Max_Var_Leaf_Size

    Max_Var_Key_Sizeに追加されるバイト数は、各変数列を追跡するためです。この数式では、すべての可変長列が 100% 満杯であることを前提としています。 可変長列ストレージ領域の割合が小さいと予想される場合は、その割合で Max_Var_Leaf_Size 値を調整して、テーブル全体のサイズをより正確に見積もることができます。

    可変長列がない場合は、 Variable_Leaf_Size を 0 に設定します。

  5. インデックス行のサイズを計算します。

    Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (インデックス行の行ヘッダーオーバーヘッドの場合) + 6 (子ページ ID ポインターの場合)

  6. ページあたりのインデックス行数を計算します (1 ページあたり 8,096 バイトの空きバイト)。

    Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)

    インデックス行はページにまたがらないので、1 ページあたりのインデックス行の数は、最も近い整数行に切り捨てる必要があります。 数式の 2 は、ページのスロット配列内の行のエントリ用です。

  7. 指定された フィル ファクター に基づいて、ページあたりの予約済み空き行数を計算します。

    Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)

    計算で使用される塗りつぶし係数は、パーセンテージではなく整数値です。 行はページをまたがないため、ページあたりの行数は最も近い整数行に切り捨てる必要があります。 充填率が高くなると、各ページに格納されるデータが増え、ページ数が少なくなります。 数式の 2 は、ページのスロット配列内の行のエントリ用です。

  8. すべての行を格納するために必要なページ数を計算します。

    Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)

    推定ページ数は、最も近い整数ページに切り上げる必要があります。

  9. インデックスのサイズを計算します (1 ページあたり合計バイト数 8192):

    Leaf_Space_Used = 8192 x Num_Leaf_Pages

手順 3. 非リーフ レベルにインデックス情報を格納するために使用される領域を計算する

次の手順に従って、インデックスの中間レベルとルート レベルを格納するために必要な領域の量を見積もります。 この手順を完了するには、手順 2 と 3 の値を保持する必要があります。

  1. インデックス内の非リーフ レベルの数を計算します。

    非リーフ レベル = 1 + ログ Index_Rows_Per_Page (Num_Leaf_Pages / Index_Rows_Per_Page)

    この値を最も近い整数に切り上げる。 この値には、非クラスター化インデックスのリーフ レベルは含まれません。

  2. インデックス内の非リーフ ページの数を計算します。

    Num_Index_Pages = ∑レベル (Num_Leaf_Pages/Index_Rows_Per_Pageレベル)(1 <= レベル <= レベル数)

    各合計を最も近い整数に切り上げる。 簡単な例として、 Num_Leaf_Pages = 1000、 Index_Rows_Per_Page = 25 のインデックスを考えてみましょう。 リーフ レベルより上の最初のインデックス レベルには、1000 個のインデックス行が格納されます。これはリーフ ページごとに 1 つのインデックス行であり、1 ページあたり 25 行のインデックス行を格納できます。 つまり、これらの 1000 行のインデックスを格納するには、40 ページが必要です。 インデックスの次のレベルでは、40 行を格納する必要があります。 これは、2 ページが必要であることを意味します。 インデックスの最終レベルでは、2 行を格納する必要があります。 これは、1 ページが必要であることを意味します。 これにより、43 個の非リーフ インデックス ページが生成されます。 前の数式でこれらの数値を使用すると、結果は次のようになります。

    非葉ノードレベル = 1 + log25 (1000 / 25) = 3

    Num_Index_Pages = 1000/(253)+ 1000/(25 2) + 1000/(251) = 1 + 2 + 40 = 43 (例で説明したページ数)。

  3. インデックスのサイズを計算します (1 ページあたり合計バイト数 8192):

    インデックス空間使用量 = 8192 x インデックスページ数

手順 4. 計算値の合計

前の 2 つの手順から取得した値の合計:

非クラスター化インデックス サイズ (バイト) = Leaf_Space_Used + Index_Space_used

この計算では、次の点は考慮されません。

  • パーティショニング

    パーティション分割による領域のオーバーヘッドは最小限ですが、計算は複雑です。 含めるのは重要ではありません。

  • 割り当てページ

    ヒープに割り当てられたページを追跡するために使用される IAM ページは少なくとも 1 つありますが、領域のオーバーヘッドは最小限であり、使用される IAM ページの正確な数を決定論的に計算するアルゴリズムはありません。

  • ラージ オブジェクト (LOB) 値

    LOB データ型の varchar(max)varbinary(max)nvarchar(max)textntextxmlimage の値の格納に使用される領域を正確に決定するアルゴリズムは複雑です。 必要な LOB 値の平均サイズを加算し、 Num_Rows乗算して、非クラスター化インデックスの合計サイズに追加するだけで十分です。

  • 圧縮

    圧縮インデックスのサイズを事前に計算することはできません。

  • スパース列

    スパース列の領域要件については、「スパース列の 使用」を参照してください。

こちらもご覧ください

クラスター化インデックスと非クラスター化インデックスの概念
非クラスター化インデックスを作成する
クラスター化インデックスの作成
テーブルのサイズを見積もる
クラスター化インデックスのサイズを見積もる
ヒープのサイズを見積もる
データベース サイズの見積もり