XMLデータのインデックスは、パス定義で定義する検索パス単位にDSI内に情報を格納します。
このため、XMLデータのインデックスの容量を算出する場合は、各検索パス単位に容量を求め、その総和がXMLデータのインデックスの容量となります。
以下に各検索パスの容量の見積りを示します。
XMLデータ部やインデックス部における、検索対象の要素・属性となる目安値を以下に示します。
検索対象となる要素・属性のデータ属性 | 長さ(バイト) |
---|---|
STRING(n) | n+(繰返しノード数×4) |
NUMBER(p,q) | j+(繰返しノード数×4) (注) |
DATE | 4+(繰返しノード数×4) |
n:長さ p:精度 q:位取り
注) jはpの値に依存して以下の値になります。
pの値(精度) | j |
---|---|
1~ 2 | 1 |
XMLデータのインデックスのデータ部やインデックス部ではキーを圧縮して格納します。この場合のキー圧縮率は以下のような目安値を使用して見積りを行います。
データ部のキー圧縮率 : 0.3 インデックス部のキー圧縮率: 0.5
XMLデータのインデックスのデータ部やインデックス部における使用率(各ページの平均使用率)は、データのキー値、データの追加および削除の順番に依存して変動します。スペース量を見積もる場合は、それぞれの値に対して、以下のような目安値を使用して見積りを行います。
データ部の使用率 : 0.5 インデックス部の使用率: 0.5
以下に示す構造のXMLグループ定義をインデックスに付加する場合の容量を計算します。
CREATE XMLGROUP 受注伝票GR ON 伝票IXDSO ( '/受注伝票/伝票番号' STRING(20), '/受注伝票/商品*/商品名' STRING(20) ) RULE (伝票種別) = ('1');
上記構造のXMLグループ定義に対するインデックスの容量見積りは、以下の手順で行います。
検索パス’/受注伝票/伝票番号'に対する容量見積りを行う。
検索パス'/受注伝票/商品*/商品名'に対する容量見積りを行う。
手順1と手順2の総和が、XMLデータのインデックスの容量となる。
上記のXMLグループに対して以下のXML文書を、XMLデータのインデックスを付加した列に格納した場合、インデックスに格納されるデータ数は’/受注伝票/伝票番号’のデータ数は1個、'/受注伝票/商品*/商品名'のデータ数は2個(’商品’ノードが繰返し構造のため)となります。検索パスあたりのインデックス格納データ数は、XMLデータ内の繰返し数にも注意してください。
<受注伝票> <伝票番号>123</伝票番号> <日付情報> <契約日>2007-01-19</契約日> <納入日>2007-02-21</納入日> </日付情報> <受注先> <社名>ABC銀行</社名> <コード>009</コード> </受注先> <商品 CPU="Pentium II 300" DISK="8"> <商品名>FMV6300</商品名> <単価>300,000</単価> <数量>200</数量> </商品> <商品 CPU="Pentium II 300" DISK=“6"> <商品名>FMV7300</商品名> <単価>350,000</単価> <数量>10</数量> </商品> </受注伝票>
格納構造:
’/受注伝票/伝票番号’と’/受注伝票/商品*/商品名’をキーとしたXML構造
ページ長(データ部):
16Kバイト
ページ長(インデックス部):
2Kバイト
使用率(データ部):
0.5
使用率(インデックス部):
0.5
圧縮率(データ部):
0.3
圧縮率(インデックス部):
0.5
インデックスに格納されるデータ数
検索パス’/受注伝票/伝票番号’の場合
30000
検索パス’/受注伝票/商品*/商品名’の場合
60000
検索パス’/受注伝票/伝票番号’に対する容量見積りを以下に示します。
【データ部】 エントリ長 = ( /受注伝票/伝票番号 ) × ( 1 - キー圧縮率 ) + 20 = 20 × ( 1 - 0.3 ) + 20 ≒ 34 (注1) セクション長 = エントリ長 × 10 + 2 = 34 × 10 + 2 = 342 ページ内セクション数 = ( データ部のページ長 - 152 ) / セクション長 = ( 16384 - 152 ) / 342 ≒ 47 (注2) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × データ部の使用率 = ( 342 / 34 ) × 47 × 0.5 ≒ 10 × 47 × 0.5 (注3) = 235 データ部のページ数 = 検索パスあたりのインデックス格納データ数 / ページ内エントリ数 = 30000 / 235 = 127.6 ≒ 128 (注1) データ部のスペース量 = ( データ部のページ数 + 1 ) × データ部のページ長 × 安全率 = ( 128 + 1 ) × 16384 × 1.3 = 2747596 (バイト) = 2683 (K バイト) → 2688 (K バイト) (注4)
注1) 小数点切上げ
注2) 小数点切捨て
注3) ( 342 / 34 )は小数点切捨て
注4) スペース量をページ長の整数倍に補正
【インデックス部】 エントリ長 = ( /受注伝票/伝票番号 + 12 ) × ( 1 - キー圧縮率 ) + 10 = ( 20 + 12 ) × ( 1 - 0.5 ) + 10 = 26 セクション長 = エントリ長 × 10 + 2 = 26 × 10 + 2 = 262 ページ内セクション数 = ( インデックス部のページ長 - 152 ) / セクション長 = ( 2048 - 152 ) / 462 ≒ 5 (注1) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × インデックス部の使用率 = ( 262 / 26 ) × 5 × 0.5 ≒ 10 × 5 × 0.5 = 25 (注2) インデックスレベル = L → 以下の条件を満たす値 ( ページ内エントリ数 )L ≧ データ部のページ数 25L ≧ 128 = 2 インデックスレベル インデックス部のページ数 = Σ ( データ部のページ数 / (ページ内エントリ数i )) i=1 2 = Σ ( 128 /( 25i )) i=1 = ( 128 / 25 ) + ( 128 / 25 / 25 ) ≒ 6 + 1 (注3) = 7 インデックス部のスペース量 = ( インデックス部のページ数 + 1 ) × インデックス部のページ長 × 安全率 = ( 7 + 1 ) × 2048 × 1.3 = 21299 (バイト) ≒ 20.8 (K バイト) → 22 (K バイト) (注4)
注1) 小数点切上げ
注2) ( 262 / 26 )は小数点切捨て
注3) 小数点切上げ
注4) スペース量をページ長の整数倍に補正
手順2.検索パス’/受注伝票/商品*/商品名’に対する容量見積り
検索パス’/受注伝票/商品*/商品名’に対する容量見積りを以下に示します。
【データ部】 エントリ長 = ( /受注伝票/商品*/商品名 ) × ( 1 - キー圧縮率 ) + 20 = 24 × ( 1 - 0.3 ) + 20 ≒ 38 (注1) セクション長 = エントリ長 × 10 + 2 = 38 × 10 + 2 = 382 ページ内セクション数 = ( データ部のページ長 - 152 ) / セクション長 = ( 16384 - 152 ) / 382 ≒ 42 (注2) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × データ部の使用率 = ( 382 / 38 ) × 42 × 0.5 ≒ 10 × 42 × 0.5 (注3) = 210 データ部のページ数 = 検索パスあたりのインデックス格納データ数 / ページ内エントリ数 = 60000 / 210 = 285.7 ≒ 287 (注1) データ部のスペース量 = ( データ部のページ数 + 1 ) × データ部のページ長 × 安全率 = ( 287 + 1 ) × 16384 × 1.3 = 6134169.6 (バイト) = 5990(K バイト) → 6000 (K バイト) (注4)
注1) 小数点切上げ
注2) 小数点切捨て
注3) ( 342 / 34 )は小数点切捨て
注4) スペース量をページ長の整数倍に補正
【インデックス部】 エントリ長 = ( /受注伝票/商品*/商品名 + 12 ) × ( キー圧縮率 ) + 10 = ( 24 + 12 ) × ( 1 - 0.5 ) + 10 = 40 セクション長 = エントリ長 × 10 + 2 = 40 × 10 + 2 = 402 ページ内セクション数 = ( インデックス部のページ長 - 152 ) / セクション長 = ( 2048 - 152 ) / 402 ≒ 5 (注1) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × インデックス部の使用率 = ( 402 / 40 ) × 5 × 0.5 ≒ 10 × 5 × 0.5 = 25 (注2) インデックスレベル = L → 以下の条件を満たす値 ( ページ内エントリ数 ) L ≧ データ部のページ数 25 L ≧ 287 = 2 インデックスレベル インデックス部のページ数 = Σ ( データ部のページ数 / ページ内エントリ数i ) i=1 2 = Σ ( 287 / 25 i ) i=1 = ( 287 / 25 ) + ( 287 / 25 / 25 ) ≒ 12+ 1 (注3) = 13 インデックス部のスペース量 = ( インデックス部のページ数 + 1 ) × インデックス部のページ長 × 安全率 = ( 13 + 1 ) × 2048 × 1.3 = 37273.6 (バイト) ≒ 36.4 (K バイト) → 38 (K バイト) (注4)
注1) 小数点切上げ
注2) ( 262 / 26 )は小数点切捨て
注3) 小数点切上げ
注4) スペース量をページ長の整数倍に補正
手順3.XMLデータのインデックスの容量(手順1と手順2の総和)
XMLデータのインデックスの容量を求める手順を以下に示します。
【XMLデータのインデックスの容量】 XMLデータのインデックスの容量 = 手順1 ( データ部のスペース量 + インデックス部のスペース量 ) + 手順2 ( データ部のスペース容量 + インデックス部のスペース量 ) = ( 2688 + 22 ) + (6000 + 38 ) = 8748 ( Kバイト ) ≒ 8.7 ( Mバイト) (注)
注) 小数点切捨て