16.1.2 表の格納ページ数の計算方法
CREATE TABLEでFIX指定をするかどうかによって,表の格納ページ数の計算方法が異なります。それぞれの計算方法を「FIX指定がない場合」と「FIX指定がある場合」に説明します。「FIX指定がない場合」及び「FIX指定がある場合」の計算式中で使用する変数については,「計算式中で使用する変数」で説明しています。表の格納ページ数の計算例については,「表の格納ページ数の計算例」で説明しています。また,リバランス機能を使用する場合のRDエリア容量見積もりを「リバランス機能を使用する場合のエリア容量見積もり」で説明しています。
なお,表を横分割する場合,格納RDエリアごとにページ数を求めてください。
- 〈この項の構成〉
(1) FIX指定がない場合
FIX指定がない場合の表の格納ページ数は,次に示す計算式で求めます。
- 計算式
表の格納ページ数= 分岐するとしたBINARY列以外を格納するページ数 +分岐するとしたBINARY列を格納するページ数 (単位:ページ)
・分岐するとしたBINARY列以外を格納するページ数
・分岐するとしたBINARY列を格納するページ数
SPN2
(a) Pの求め方
Pの求め方を次に示します。なお,Pの分母の括弧部は1ページに格納される行数であり,最小1,最大255とします。
(b) PSiの求め方
PSiの求め方を次に示します。次に示す計算式で各PSiを計算し,その総和を求めてください。なお,nは表「可変長文字列型のデータ長一覧(抽象データ型及び繰返し列を除く)」に該当する列の数を示しています。
PSi=a×↑ei÷(b−62)↑
(2) FIX指定がある場合
FIX指定がある場合の表の格納ページ数は,次に示す計算式で求めます。
- 計算式
(a) Qの求め方
Qの求め方を次に示します。なお,Qの分母の括弧部は1ページに格納される行数であり,最小1,最大255とします。
(3) 計算式中で使用する変数
a:表に格納する行の総数(件)
b:ユーザ用RDエリアのページ長(バイト)
- c:CREATE TABLEで指定する未使用領域の比率(%)
-
未使用領域の比率を指定しない場合は,30%を仮定して計算します。
- di:各列のデータ長(バイト)
-
表「データ長一覧」を参照して,すべての列について求めてください。
抽象データ型の列のデータ長については,「抽象データ型の列のデータ長の求め方」を参照してください。
繰返し列のデータ長については,「繰返し列のデータ長の求め方」を参照してください。
- ei:列のデータ長の平均値(バイト〉
-
-
既定義型で定義された列の場合,表「可変長文字列型のデータ長一覧(抽象データ型及び繰返し列を除く)」を参照して,表中に示したデータ型の列についてだけ求めてください。
-
抽象データ型で定義された列の場合,表「可変長文字列型のデータ長一覧(抽象データ型の場合)」を参照して,表中に示したデータ型の列についてだけ求めてください。
-
繰返し列の場合,表「可変長文字列型のデータ長一覧(繰返し列の場合)」を参照して,表中に示したデータ型の列についてだけ求めてください。
-
f:表に定義する列の総数(個)
g:表を格納するRDエリアのセグメントサイズ(ページ)
- h:CREATE TABLEで指定するセグメント内の空きページ比率(%)
-
セグメント内の空きページ比率を指定しない場合は,10%を仮定して計算します。ここでいう空きページとは,未使用ページのことです。
- Z:次に示すどちらかを代入します。
-
-
pd_dbreuse_remaining_entriesオペランドの指定値がALL,又は,ONLY_USERの場合:0
-
pd_dbreuse_remaining_entriesオペランドの指定値が上記以外の場合:510
-
- SPN1:分岐するとした列(BINARY以外)を格納するページ数
-
なお,分岐する条件については表「データ長一覧」の注※5で説明しています。
SPN1= f Σ↑分岐するとしたdiの値÷(b−61)↑×a×SF i=1
- SPN2:分岐するとしたBINARY列を格納するページ数
-
なお,分岐する条件については表「データ長一覧」の注※5で説明しています。
SPN2=SPN2A+SPN2B+SPN2C ・INSERT SQLによる分岐ページ数 分岐するとしたBINARY列について計算します。 SPN2A= k {Σ↓Li÷(b−59)↓×a+A}×SF i=1 ・pdload又はpdrorgによる分岐ページ数 Li>(b−2853)÷255 のとき SPN2B= k ↑{Σ(Li+11)×a}÷(b−48)↑×SF i=1 Li≦(b−2853)÷255 のとき SPN2C= ↑a÷255↑×SF
Aの計算式を次に示します。
k:分岐するとした列の数
- Li:各列の実際のデータ長(バイト)
-
圧縮列の場合は次の計算式の値になります。
圧縮後のデータ長+(↑圧縮前のデータ長÷圧縮分割サイズ↑)×8
- SF:1.3
-
ただし,次に示す場合は1.3より大きくしてください。
-
抽象データ型の列を大量に更新する場合
-
繰返し列に対して要素のデータ長が大きくなる更新又は要素数が増える更新を大量に実行する場合
-
VARCHAR,NVARCHAR,MVARCHAR,又はBINARY型の列に対してデータ長が大きくなる更新を大量に実行する場合
-
BINARY型の列に,データ長が大きくなる更新を大量に実行する場合
-
列ごとのデータ抑制が実行された列に対して,データ長が大きくなる更新を大量に実行する場合
-
前記以外のデータ型で,NULL値から非NULL値への更新を大量に実行する場合
-
d:実際のデータ長(文字数)
m,n:正の整数
γ:圧縮後のデータ長(文字数)
- 注※1
-
全体のけた数がmけたで,小数点以下のけた数がnけたの固定小数点数です。mを省略した場合は15を仮定します。
- 注※2
-
表定義時に表オプションにSUPPRESS DECIMALを指定した場合,データ長は「↓k÷2↓+2」になります。kは,格納時の有効けた数(先頭の0の部分を除いたけた数)を示します。なお,次に示す場合はSUPPRESS DECIMALを使用しないでください。計算式中のaは,SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の,表中の列のデータ長の合計値です。
32717<(a+表中の列数×2+8)
- 注※3
-
列データ抑制指定をして,データ抑制された場合,nは「n−b+4」になります。なお,データ抑制は,列データ抑制指定時,列データの最後の文字が空白の場合,その最後の文字と連続している半角の空白が4文字以上あるときだけ実行されます。bは,列データの最後の文字と連続している空白の数を示します。
ただし,列データ抑制指定をして,データ抑制されなかった場合は,列ごとに1バイトの付加情報が追加されます。
なお,次に示す場合は列データ抑制指定を使用しないでください。計算式中のaは,SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の,表中の列のデータ長の合計値です。
32717<(a+表中の列数×2+8)
- 注※4
-
列データ抑制指定をして,データ抑制された場合,2×nは「2×n−2×b+5」になります。なお,データ抑制は,列データ抑制指定時,列データの最後の文字が空白の場合,その最後の文字と連続している全角の空白が3文字以上あるときだけ実行されます。bは,列データの最後の文字と連続している空白の数を示します。
ただし,列データ抑制指定をして,データ抑制されなかった場合は,列ごとに1バイトの付加情報が追加されます。
なお,次に示す場合は列データ抑制指定を使用しないでください。計算式中のaは,SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の,表中の列のデータ長の合計値です。
32717<(a+表中の列数×2+8)
- 注※5
-
通常は分岐しない場合で計算します。次に示す計算式が成立する場合に分岐します。なお,圧縮列の場合,データ長は圧縮前のデータ長で計算してください。
BL>ページ長−50 f BL(バイト)=Σ di+2×f+6 i=1
この分岐条件が成立した場合は,分岐しないとした列を列番号の小さい方から分岐条件が成立しなくなるまで分岐するとしてBLを計算し直してください。
表16‒2 可変長文字列型のデータ長一覧(抽象データ型及び繰返し列を除く) データ型
データ長
(バイト)
VARCHAR(n)
d≧256
d+2
ノースプリットオプション指定あり
0
NVARCHAR(n)
d≧128
2×d+2
ノースプリットオプション指定あり
0
MVARCHAR(n)
d≧256
d+2
ノースプリットオプション指定あり
0
(4) 抽象データ型の列のデータ長の求め方
抽象データ型の列のデータ長diは,次に示す計算式で求めます。
- 計算式
h di= Σ ADTk+5 k=1
- h:抽象データ型の継承の数(個)
-
継承なしの場合は1
CREATE TYPE文でUNDERオペランドを指定して別の抽象データ型を継承した場合,最も上位の抽象データ型をh番目,最も下位の抽象データ型を1番目としてください。
- ADTk:抽象データ型のデータ長(バイト)
-
次に示す計算式で求めてください。
m ADTk= Σ attj+10+2×m i=1
m:抽象データ型の全属性数(個)
- attj:抽象データ型の各属性のデータ長(バイト)
-
継承がない場合は,m=1であり,ADT1を計算します。
各属性のデータ長については,表「データ長一覧」を参照してください。ただし,データ型が表「可変長文字列型のデータ長一覧(抽象データ型の場合)」で示す条件を満たしている場合は,表「可変長文字列型のデータ長一覧(抽象データ型の場合)」に従ってデータ長を計算してください。
また,対応するattejの値を次に示す計算式に代入して,分岐行格納ページ数ADTLSをPに加算してください。
h ADTLS= Σ ↑attej÷(b−62)↑×a i=1
属性が抽象データ型で定義されている場合は,次に示す計算式で属性のデータ長を求めてください。
h attj(バイト)= Σ ADTk+5 k=1
d:実際のデータ長(文字数)
(5) 繰返し列のデータ長の求め方
繰返し列のデータ長は,次に示す計算式で求めます。
- 計算式
di=4+(eli+1)×eni
- eli:繰返し列のデータ長
-
表「データ長一覧」から求めてください。
ただし,可変長文字列型の場合は,表「可変長文字列型のデータ長一覧(繰返し列の場合)」から求めてください。
- eni:繰返し列の平均要素数
d:実際のデータ長(文字数)
可変長文字列型の繰返し列で,eliの値が表「可変長文字列型のデータ長一覧(繰返し列の場合)」の条件を満たす列について,次に示す計算式の値をPに加算してください。
m ↑Σ{ esi×eni+14×(eni−1)}÷(b−62)↑×a i=1
m:表「可変長文字列型のデータ長一覧(繰返し列の場合)」の条件を満たす可変長文字列型の繰返し列数
- esi:1要素当たりの実際のデータ長の平均値
-
表「可変長文字列型のデータ長一覧(抽象データ型及び繰返し列を除く)」に示したデータ長を適用します。
(6) リバランス機能を使用する場合のエリア容量見積もり
ハッシュ関数HASHA,HASHB,HASHC,HASHD,HASHE,HASHFを使用した分割表の場合,データは1,024個のハッシュ要素値に分けられ,値ごとに別々のセグメントに格納されます。
各分割RDエリアには,平均(1024÷分割数)のハッシュ要素数のデータが格納されます。このため,各RDエリアには,少なくともそのRDエリアに格納される要素数分のセグメントを割り当てる必要があります。
リバランス機能を使用する場合のRDエリア容量は次のように見積もります。
-
データ件数N,行長L,ページ長Pから,必要な総セグメント数Snを見積もります。
-
RDエリア当たりに必要なセグメント数Ssnを見積もります。
- Ssn=↑Sn÷Srn↑×Srn
-
Srn:↑1024÷Dvn↑
Dvn:RDエリア分割数
-
余裕値を考慮して,RDエリア当たりの使用中セグメント数Sを見積もります。
- S=↑(Ssn×K)÷Srn↑×Srn
-
K:係数(例:余裕率20%の場合,1.2)
(7) 表の格納ページ数の計算例
(a) 例題
次に示す在庫表の表格納ページ数を求めます。
品番 |
商品名 |
規格 |
単価 |
数量 |
原価 |
---|---|---|---|---|---|
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 |
- 計算条件
-
-
表に格納する行の総数:10000件
-
ユーザ用RDエリアのページ長:8192バイト
-
CREATE TABLEで指定する未使用領域の比率:30%
-
列数:6列
-
表を格納するRDエリアのセグメントサイズ:100ページ
-
CREATE TABLEで指定するセグメント内の空きページ比率:40%
-
列のデータ型:次に示します。
品番:CHARACTER(5)
商品名:NCHAR(4)
規格:CHARACTER(3)
単価:INTEGER
数量:INTEGER
原価:INTEGER
-
システム共通定義pd_dbreuse_remaining_entriesオペランドを指定していない
-
- FIX指定がない場合
-
1. 行長の計算
5(品番)+2×4(商品名)+3(規格)+4(単価)+4(数量)+4(原価)=28バイト
2. Pの計算
3. 表の格納ページ数の計算
- FIX指定がある場合
-
1. 行長の計算
5(品番)+2×4(商品名)+3(規格)+4(単価)+4(数量)+4(原価)=28バイト
2. Qの計算
3. 表の格納ページ数の計算