索引のスペース所要量

索引を設計するときは、そのスペース所要量について留意する必要があります。 圧縮索引の場合、このトピックの公式から導き出した見積もりを上限として使用できますが、それはかなり小さくなる可能性があります。

非圧縮索引のスペース所要量

各非圧縮索引に必要なスペースは、次のようにして見積もることができます。
  • (平均索引キー・サイズ + 索引キー・オーバーヘッド) × 行数 × 2
ここで、
  • average index key (平均索引キー)」サイズは、索引キーの中の各列のバイト・カウントです。 VARCHAR および VARGRAPHIC 列の平均の列サイズを見積もるには、現行データ・サイズの平均に 2 バイトを加えます。
  • index key overhead (索引キーのオーバーヘッド)」は、索引が作成される表のタイプに依存します。
    表 1. さまざまな表の索引キーのオーバーヘッド
    表スペースのタイプ 表タイプ キーワード・タイプ 索引キーのオーバーヘッド (バイト) 重複索引キーのオーバーヘッド (バイト)
    任意 任意 XML パスまたは領域 11 7
    通常 非パーティション 任意 7 5
    パーティション パーティション 7 5
    非パーティション 9 7
    非パーティション 任意 9 7
    パーティション パーティション 9 7
    非パーティション 11 9
  • number of rows (行数)」は、表内の行数または特定のデータ・パーティション内の行数です。 この計算での表全体の行数を使用することにより、索引 (非パーティション索引の場合) または結合されたすべての索引パーティション (パーティション索引の場合) のサイズの見積もりが得られます。 データ・パーティション内の行数を使用することにより、索引パーティションのサイズの見積もりが得られます。
  • 2 倍しているのは、非リーフ・ページやフリー・スペースなどのオーバーヘッドのためです。
注:
  1. NULL 値が可能な列の場合は、NULL 値標識のために 1 バイトをさらに追加してください。
  2. マルチディメンション・クラスタリング (MDC) 表または挿入時クラスタリング (ITC) 表のために内部で作成されたブロック索引の場合、number of (行数) を number of blocks (ブロック数) で置き換えることになります。
  3. ランダムな配列を使用する列については、それぞれに 2 バイトを追加してください。

XML 索引のスペース所要量

XML 列の各索引に必要なスペースは、次のようにして見積もることができます。
  • (平均索引キー + 索引キー・オーバーヘッド) × 索引付きノードの数 × 2
ここで、
  • average index key (平均索引キー)」は、索引を構成しているキー・パーツの合計です。 XML 索引は、いくつかの XML キー・パーツと値 (sql-data-type) で構成されています。
    • 14 + variable overhead + sql-data-type のバイト・カウント
    ここで、
    • 14 は、固定オーバーヘッドのバイト数を表します。
    • variable overhead (可変オーバーヘッド)」は、索引付きノードの平均の深さに 4 バイトを加算した値です。
    • byte count of sql-data-type (sql-data-type のバイト・カウント)」は、SQL と同じ規則に従います。
  • number of indexed nodes (索引ノード数)」は、挿入される文書の数に、索引定義の XML パターン式 (XMLPATTERN) を満たすサンプル文書内のノードの数を乗算した値です。 「number of indexed nodes (索引ノード数)」は、パーティション内または表全体のノード数にすることができます。

索引作成の一時スペース所要量

索引の作成時には一時スペースが必要になります。 索引作成時に必要な一時スペースの最大量は、次のようにして見積もることができます。
  • (平均索引キー・サイズ + 索引キー・オーバーヘッド) × 行数 × 3.2
空間インデックス、XML 列の索引、および内部 XML 領域索引などの、1 行につき複数の索引キーが存在する可能性がある索引の場合、必要な一時スペースは以下のように見積もることができます。
  • (平均索引キー・サイズ + 索引キー・オーバーヘッド) × 索引付きノードの数 × 3.2
ここで、3.2 という係数は、索引のオーバーヘッド、および索引作成時のソートに必要なスペースに起因します。 「number of rows (行数)」または「number of indexed nodes (索引ノード数)」は、表全体または特定のデータ・パーティション内の数です。
注: 非ユニーク索引の場合、 特定のリーフ・ノードに保管される重複キー項目のコピーは 1 つのみです。 LARGE 表スペースにある表の索引の場合、重複キーのサイズは、非パーティション索引の場合は 9、パーティション索引、および非パーティション表の索引の場合は 7 になります。 REGULAR 表スペースにある表の索引の場合、これらの値は非パーティション索引の場合は 7、パーティション索引、および非パーティション表の索引の場合は 5 になります。 これらの規則の唯一の例外は XML パスおよび XML 領域索引であり、その場合の重複キーのサイズは常に 7 です。 上記の見積もりは、重複がないことを前提としています。 1 つの索引を保管するために必要なスペースは、前述の公式では余分に見積もってしまう場合があります。
「number of index nodes (索引ノード数)」が 64 KB のデータを超える場合は、挿入時に一時スペースが必要です。 一時スペースの量は、次のようにして見積もることができます。
  • 平均索引キー・サイズ × 索引付きノードの数 × 1.2

リーフ・ページ当たりのキーの数の見積もり

索引リーフ・ページごとのキーの数を見積もるために、以下の 2 つの公式を使用できます (2 番目の方がより正確な見積もりが可能です)。 これらの見積もりの精度は、 平均値がどの程度うまく実際のデータを反映しているかに大きく依存しています。

注: SMS 表スペースの場合、リーフ・ページの最小必須スペースは ページ・サイズの 3 倍です。 DMS 表スペースの場合、最小は 1 エクステントです。
  1. リーフ・ページ当たりのキーの数の平均値は、おおよそ以下のように見積もることができます。
    • ((.9 * (ウー - (×2))) × (D 日 + 1)) ÷ (K + 7 + (データ・セット × D 日))
    ここで、
    • U (ページでの使用可能なスペース) は、ページ・サイズから 100 を引いた数値とほぼ等しい。 例えば、ページ・サイズが 4096 の場合、U は 3996。
    • M = U ÷ (9 + minimumKeyサイズ)
    • Ds = duplicateKeySize (索引作成の一時スペース所要量にある注を参照。)
    • D = キー値当たりの重複の平均数
    • K = averageKeyサイズ
    注: minimumKeySize および averageKeysize には、以下の追加情報を含める必要があります。
    • NULL 可能なそれぞれのキー・パーツに対して 1 バイト
    • 可変長キー・パーツそれぞれの長さに対して 2 バイト
    • ランダムな順序付けで定義されているそれぞれの列に対して 2 バイト

    組み込み列がある場合は、 それらを minimumKeySizeaverageKeySize 用に計算に入れる必要があります。

    minimum key size (最小キー・サイズ)」は、索引を構成しているキー・パーツの合計です。
    • fixed overhead + variable overhead + sql-data-type のバイト・カウント
    ここで、
    • fixed overhead (固定オーバーヘッド)」は 13 バイトです。
    • variable overhead (可変オーバーヘッド)」は、索引付きノードの最小の深さに 4 バイトを加算した値です。
    • byte count of sql-data-type (sql-data-type のバイト・カウント)」値は、SQL と同じ規則に従います。

    索引の作成時にデフォルト値の 10% 以外の空きパーセント値が指定された場合、.9 は任意の (100-pctfree)/100 値に置き換えることができます。

  2. リーフ・ページ当たりのキーの数の平均値をより正確に見積もるには、以下のようにします。
    • リーフ・ページ数 = x /(リーフ・ページの平均キー数)
    ここで x は表またはパーティションの中の行の総数です。

    XML 列の索引の場合、x は列内にある索引付きノードの総数です。

    次のようにして索引の元のサイズを見積もることができます。
    • (L + 2L/(リーフ・ページのキーの平均数)) × pagesize

    DMS 表スペースの場合、1 つの表上のすべての索引について合計サイズを算出し、 索引が存在する表スペースのエクステント・サイズの倍数に切り上げます。

    挿入 (INSERT) /更新 (UPDATE) アクティビティーによる索引の増加のための追加スペースを設ける必要がありますが、これによりページの分割が生じる場合があります。

    元の索引サイズのより正確な見積もりと、 索引の中のレベルの数の見積もりを出すには、以下の計算式を使用します。 (これは、索引定義で組み込み列が使用されている場合は特に注意を引くものとなります。) ノンリーフ・ページ当たりのキーの数の平均値は、おおよそ以下のようになります。
    • ((.9 × (U -(M × 2))) × (D + 1)) ÷ (K + 13 + (9 * D))
    ここで、
    • U (ページでの使用可能なスペース) は、ページ・サイズから 100 を引いた数値とほぼ等しい。 ページ・サイズが 4096 の場合、U は 3996。
    • D はノンリーフ・ページ上のキー値あたりの平均重複数 (この数はリーフ・ページ上での数よりもずっと小さいので、この値を 0 に設定して計算を単純化することもできます)。
    • M = U ÷ (9 + ノンリーフ・ページの minimumKeySize)
    • K = ノンリーフ・ページの averageKeySize

    ノンリーフ・ページの minimumKeySize および averageKeySize は、 組み込み列が存在する場合を除いて、リーフ・ページのものと同じです。 組み込み列は、ノンリーフ・ページ上には保管されません。

    (100 - pctfree)÷100 の値が .9 より大きくなければ、この値を .9 で置き換えることはできません。なぜなら、索引作成中に最大 10 % のフリー・スペースがノンリーフ・ページに残されるからです。

    ノンリーフ・ページの数は、次のようにして見積もることができます。
       if L > 1 then {P++; Z++}
       While (Y > 1)
       { 
          P = P + Y
          Y = Y / N
         Z++
       }
    ここで、
    • P はページの数 (初期値は 0)。
    • L はリーフ・ページの数。
    • N は各ノンリーフ・ページのキーの数。
    • Y = L ÷ N
    • Z は索引ツリーのレベルの数 (初期値は 1)。
    注: 上記の計算は、単一の非パーティション索引、またはパーティション索引の単一の索引パーティションに適用されます。
    ページの合計数は、
    • T = (L + P + 2) × 1.0002
    追加の 0.02% (1.0002) は、スペース・マップ・ページを含むオーバーヘッドのためのものです。
    索引を作成するために必要なスペースの量は次のように見積もります。
    • T × ページ・サイズ