Hitachi

ノンストップデータベース HiRDB Version 9 システム導入・設計ガイド(Windows(R)用)


16.1.3 インデクスの格納ページ数の計算方法

インデクスの格納ページ数の計算方法を「計算方法」で説明します。「計算方法」の計算式中で使用する変数については「計算式中で使用する変数」で説明しています。インデクスの格納ページ数の計算例については「インデクスの格納ページ数の計算例」で説明しています。

なお,CREATE TABLEでクラスタキーを指定する場合,インデクスの格納ページ数を求める方法と同じ方法で,クラスタキーの格納ページ数を求めてください。

また,インデクスを横分割する場合,格納RDエリアごとにページ数を求めてください。

注意事項

インデクスページスプリットが発生すると,インデクスページ内のキーの格納比率を50:50にして二つのインデクスページに分割します。このため,インデクスの追加又は更新が多く発生すると,インデクスの格納ページ数は最大で見積もり式の2倍の容量が必要となります。また,最大キーが格納されたリーフページのインデクスページスプリットは,UAPからのINSERTであってもPCTFREEオペランドの値が考慮されます。

なお,インデクスページスプリットの発生回数を削減する方法の一つにアンバランスインデクススプリットがあります。インデクスページスプリット及びアンバランスインデクススプリットについては,マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

〈この項の構成〉

(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

ただし,複数列インデクスのキー長は,表「インデクスのキー長一覧」を基に全構成列のキー長を加算したものとなります。

表16‒5 インデクスのキー長一覧

分類

データ型

キー長(単位:バイト)

キー長が255バイト以下

キー長が256バイト以上

単一列

インデクス

複数列インデクス

単一列

インデクス

複数列インデクス

固定長※1

可変長※2

固定長※1

可変長※2

数値

データ

INTEGER

4

5

6

5

7

SMALLINT

2

3

4

3

5

LARGE DECIMAL

(m,n)※3

↓m÷2↓

+1

↓m÷2↓+2

↓m÷2↓+3

↓m÷2↓+2

↓m÷2↓+4

FLOAT又は

DOUBLE

PRECISION

8

×

×

×

×

SMALLFLT

又はREAL

4

×

×

×

×

文字

データ

CHARACTER

(n)

n

n+1

n+2

n

n+1

n+3

VARCHAR(n)

a+1

a+2

a+2

a+3

各国

文字

データ

NCHAR(n)

又はNATIONAL CHARACTER

(n)

2×n

2×n+1

2×n+2

2×n

2×n+1

2×n+3

NVARCHAR

(n)

2×b+1

2×b+2

2×b+2

2×b+3

混在

文字

データ

MCHAR(n)

n

n+1

n+2

n

n+1

n+3

MVARCHAR

(n)

a+1

a+2

a+2

a+3

日付

データ

DATE

4

5

6

5

7

時刻

データ

TIME

3

4

5

4

6

日間隔

データ

INTERVAL YEAR TO

DAY

5

6

7

6

8

時間隔

データ

INTERVAL HOUR TO

SECOND

4

5

6

5

7

時刻印

データ

TIMESTAMP(p)

7+(p÷2)

8+(p÷2)

9+(p÷2)

8+(p÷2)

10+(p÷2)

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

計算条件
  1. インデクスのキーの総数:10,000件

  2. ユーザ用RDエリアのページ長:8,192バイト

  3. CREATE INDEXで指定する未使用領域の比率:30%

  4. インデクスのデータ型:CHARACTER

  5. インデクスのキー長:5バイト

  6. キーの重複数:1

計算式

[図データ]

(b) 例題2

例題1に示す在庫表の「商品名」をインデクス(重複するキーがある)とする場合のインデクス格納ページ数を求めます。

計算条件
  1. インデクスのキーの総数:10,000件

  2. ユーザ用RDエリアのページ長:8,192バイト

  3. CREATE INDEXで指定する未使用領域の比率:30%

  4. インデクスのデータ型:NCHAR

  5. インデクスのキー長:4文字(漢字)

  6. キー値の重複が201以上のキーの種類の個数

    (このときの平均重複数は250):1

  7. キー値の重複が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

計算条件
  1. インデクスのキーの総数:10,000件

  2. ユーザ用RDエリアのページ長:8,192バイト

  3. CREATE INDEXで指定する未使用領域の比率:30%

  4. 1964年度の入会人数:1,000人

  5. ほかの年度の入会人数:200人以下

  6. 入会年度:1965〜1995の31年間

  7. 入会する男女の数は,毎年同数とします。

  8. 列のデータ型:次に示します。

    会員番号:CHARACTER(5)

    氏名:NCHAR(4)

    年齢:INTEGER

    性別:CHARACTER(4)

    入会年度:INTEGER

計算式
  1. 1965年度以降の31年間に入会した人(男,女含めて200人以下)のキーの種類の個数(c)は,c=31×2=62となります。

  2. 重複数の平均値(d)は,d=(10000−1000)÷62=146となります。

  3. 1964年の1年間に入会した人(男,女含めて1000人)のキーの種類の個数(e)は,e=2となります。

  4. 重複数の平均値(f)は,f=1000÷2=500となります。

  5. 性別と入会年度のDB格納キー長(g)は,

    g=↑(4+1+5)÷4↑×4=12となります。

    [図データ]