16.1.3 インデクスの格納ページ数の計算方法
インデクスの格納ページ数の計算方法を「計算方法」で説明します。「計算方法」の計算式中で使用する変数については「計算式中で使用する変数」で説明しています。インデクスの格納ページ数の計算例については「インデクスの格納ページ数の計算例」で説明しています。
なお,CREATE TABLEでクラスタキーを指定する場合,インデクスの格納ページ数を求める方法と同じ方法で,クラスタキーの格納ページ数を求めてください。
また,インデクスを横分割する場合,格納RDエリアごとにページ数を求めてください。
- 注意事項
-
インデクスページスプリットが発生すると,インデクスページ内のキーの格納比率を50:50にして二つのインデクスページに分割します。このため,インデクスの追加又は更新が多く発生すると,インデクスの格納ページ数は最大で見積もり式の2倍の容量が必要となります。また,最大キーが格納されたリーフページのインデクスページスプリットは,UAPからのINSERTであってもPCTFREEオペランドの値が考慮されます。
なお,インデクスページスプリットの発生回数を削減する方法の一つにアンバランスインデクススプリットがあります。インデクスページスプリット及びアンバランスインデクススプリットについては,マニュアル「HiRDB システム運用ガイド」を参照してください。
- 〈この項の構成〉
(1) 計算方法
インデクスの格納ページ数は,次に示す計算式で求めます。
- 計算式
n インデクスの格納ページ数(単位:ページ)= Σ Pi+Pd i=1
Piは,計算式1に示す漸化式から求めます。
Pn=1となるまでPi+1の計算をし,その計算結果の総計を求めてください。
Pdは,キー値の重複が201以上の場合に計算します。Pdの求め方を計算式2に示します。
- 計算式1
- 計算式2
- 繰返し列を含むインデクスの場合の1行当たりの繰返し要素の重複数について
-
繰返し列を含むインデクスの場合,1行当たりの繰返し要素の重複数は,次に示す計算式の値を超えないようにしてください。
重複数=↓(↓a×0.95↓−82)÷4↓−1
(2) 計算式中で使用する変数
a:ユーザ用RDエリアのページ長(バイト)
b:CREATE INDEXで指定する未使用領域の比率※1(%)
c:キー値の重複が200以下のキーの種類の個数(個)※2,3,4
d:キー値の重複が200以下のキーの重複数の平均値(個)※3,5
e:キー値の重複が201以上のキーの種類の個数(個)※3,4
f:キー値の重複が201以上のキーの重複数の平均値(個)※3,5
g:DB格納キー長※6(バイト)
- h:次に示すどちらかを代入します。
-
-
ユニークインデクスの場合:ナル値以外のキーの種類の個数(個)
なお,複数列インデクスの場合は,構成列にナル値を含まない全キー数となります。
-
ユニークインデクス以外の場合:0
-
- 注※1
-
未使用領域の比率を指定しない場合は,30%を仮定して計算します。また,クラスタキーを指定する場合は,CREATE TABLEで指定する未使用領域の比率とします。
- 注※2
-
ユニークインデクスの重複がないキーを含める必要があります。
- 注※3
-
c×d+e×fの値が,インデクスのキーの総数以上になるように計算してください。
- 注※4
-
ユニークインデクスの重複があるキー(キー値にナル値を含むことで重複するキー)を含める必要があります。
- 注※5
-
小数点未満は整数値に切り上げてください。
- 注※6
-
表「インデクスのキー長一覧」を参照してください。DB格納キー長は,次に示す計算式で求めます。
-
単一列インデクス及び固定長複数列インデクスの場合
↑キー長÷4↑×4
-
可変長複数列インデクスで,かつキー長255バイト以下の場合
↑(キー長+1)÷4↑×4
-
可変長複数列インデクスで,かつキー長256バイト以上の場合
↑(キー長+2)÷4↑×4
ただし,複数列インデクスのキー長は,表「インデクスのキー長一覧」を基に全構成列のキー長を加算したものとなります。
-
a:実際のデータ長
b:実際の文字数
m,n,p:正の整数
×:インデクス定義時にエラーになります。
−:該当しません。
- 注
-
最初は「キー長が255バイト以下」で計算してください。その結果,キー長が256バイト以上になる場合は,「キー長が256バイト以上」で再計算してください。
- 注※1
-
構成列が固定長の列だけのインデクスのキー長です。
- 注※2
-
構成列に可変長の列を含むインデクスのキー長です。
- 注※3
-
全体のけた数がmけたで,小数点以下のけた数がnけたの固定小数点数です。mを省略した場合は15を仮定します。
- 参考
-
非ユニークインデクスは,インデクスのデータの格納領域中に重複数を格納する領域を持つため,その分容量が大きくなります。一方,ユニークインデクスは重複数を格納する領域を持ちません。そのため,非ユニークインデクスよりもユニークインデクスの方が容量が小さくなります。
(3) インデクスの格納ページ数の計算例
(a) 例題1
次に示す在庫表の「品番」をユニークインデクス(重複するキーがない)とする場合のインデクス格納ページ数を求めます。
品番 |
商品名 |
規格 |
単価 |
数量 |
原価 |
---|---|---|---|---|---|
20180 |
掃除機 |
C20 |
20000 |
26 |
15000 |
20190 |
掃除機 |
C77 |
28000 |
105 |
23000 |
20130 |
冷蔵庫 |
P10 |
30000 |
70 |
25000 |
20220 |
テレビ |
K18 |
35000 |
12 |
30000 |
20200 |
掃除機 |
C89 |
35000 |
30 |
30000 |
20140 |
冷蔵庫 |
P23 |
35000 |
60 |
30000 |
20280 |
アンプ |
L10 |
38000 |
200 |
33000 |
20150 |
冷蔵庫 |
P32 |
48000 |
50 |
43000 |
20290 |
アンプ |
L50 |
49800 |
260 |
45000 |
20230 |
テレビ |
K20 |
50000 |
15 |
45000 |
20160 |
冷蔵庫 |
P35 |
55800 |
120 |
50000 |
- 計算条件
-
-
インデクスのキーの総数:10,000件
-
ユーザ用RDエリアのページ長:8,192バイト
-
CREATE INDEXで指定する未使用領域の比率:30%
-
インデクスのデータ型:CHARACTER
-
インデクスのキー長:5バイト
-
キーの重複数:1
-
- 計算式
(b) 例題2
例題1に示す在庫表の「商品名」をインデクス(重複するキーがある)とする場合のインデクス格納ページ数を求めます。
- 計算条件
-
-
インデクスのキーの総数:10,000件
-
ユーザ用RDエリアのページ長:8,192バイト
-
CREATE INDEXで指定する未使用領域の比率:30%
-
インデクスのデータ型:NCHAR
-
インデクスのキー長:4文字(漢字)
-
キー値の重複が201以上のキーの種類の個数
(このときの平均重複数は250):1
-
キー値の重複が200以下のキーの種類の個数
(このときの平均重複数は5):(10000−250)÷5=1950
-
- 計算式
次に示す会員表の「性別」と「入会年度」を複数列インデクスとする場合のインデクス格納ページ数を求めます。
会員番号 |
氏名 |
年齢 |
性別 |
入会年度 |
---|---|---|---|---|
0001 |
安東洋子 |
18 |
F |
1983 |
0002 |
浅井順一 |
25 |
M |
1967 |
0003 |
石井公子 |
24 |
F |
1987 |
0004 |
石井一郎 |
25 |
M |
1964 |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
1000 |
渡辺英雄 |
30 |
M |
1995 |
- 計算条件
-
-
インデクスのキーの総数:10,000件
-
ユーザ用RDエリアのページ長:8,192バイト
-
CREATE INDEXで指定する未使用領域の比率:30%
-
1964年度の入会人数:1,000人
-
ほかの年度の入会人数:200人以下
-
入会年度:1965〜1995の31年間
-
入会する男女の数は,毎年同数とします。
-
列のデータ型:次に示します。
会員番号:CHARACTER(5)
氏名:NCHAR(4)
年齢:INTEGER
性別:CHARACTER(4)
入会年度:INTEGER
-
- 計算式
-
-
1965年度以降の31年間に入会した人(男,女含めて200人以下)のキーの種類の個数(c)は,c=31×2=62となります。
-
重複数の平均値(d)は,d=(10000−1000)÷62=146となります。
-
1964年の1年間に入会した人(男,女含めて1000人)のキーの種類の個数(e)は,e=2となります。
-
重複数の平均値(f)は,f=1000÷2=500となります。
-
性別と入会年度のDB格納キー長(g)は,
g=↑(4+1+5)÷4↑×4=12となります。
-