Symfoware(R) Server RDBユーザーズガイド データベース定義編 - FUJITSU - |
目次 索引 |
各格納構造ごとに、必要となるデータベーススペース量の見積りを示します。計算式で使用する使用率などの値は目安値を後述しますが、これらの値はデータに依存して異なるため、値に幅があります。余裕をもって見積もる(安全率を乗算する)ことをお勧めします。
RANDOM構造のプライム部やオーバフロー部、BTREE構造のデータ部やインデックス部における使用率(各ページの平均使用率)やRANDOM構造のオーバフロー率(総レコード数に対するオーバフロー部へのあふれ率)は、データのキー値およびデータの追加、削除の順番に依存して変動します。スペース量を見積もる場合は、それぞれの値に対して、以下のような目安値を使用して見積りを行います。
なお、ページ内レコード数が少ない場合、各使用率は低い値となり、オーバフロー率については高い値となります。
プライム部の使用率 : 0.4 〜 0.8 オーバフロー部の使用率 : 0.2 〜 0.5 オーバフロー率 : 0.2 〜 0.6(クラスタキーに一意性制約が 設定されている場合) : 0.9 〜 1.0(クラスタキーに一意性制約が 設定されていない場合) BTREEデータ部の使用率 : 0.5 BTREEインデックス部の使用率 : 0.5 |
BTREE構造のデータ部やインデックス部ではキーを圧縮して格納します。この場合のキー圧縮率は以下のような目安値を使用して見積りを行います。
BTREEデータ部のキー圧縮率 : 0.3 BTREEインデックス部のキー圧縮率 : 0.5 |
例1
SEQUENTIAL構造のスペース量の見積り次のような構造の発注表(総レコード数:30000件)の所要スペース量を計算します。
CREATE TABLE STOCKS.発注表 ( 取引先 SMALLINT NOT NULL, 取引製品 SMALLINT NOT NULL, 仕入価格 INTEGER, 発注数量 SMALLINT )格納構造:SEQUENTIAL構造
ページ長:32 Kバイト
安全率:1.3
レコード長 = ( 取引先 + 取引製品 + 仕入価格 + 発注数量 ) + ( 可変長列の数 × 4 + 2 ) + 可変長列の長さ + ナルタグ数 + 26 ≒ ( 2 + 2 + 4 + 2 ) + 0 + 0 + 2 + 26 (注1) = 38 ページ内レコード数 = ( ページ長 − 94 ) / レコード長 = ( 32768 − 94 ) / 38 = 859.8421053… ≒ 859 (注2) スペース量 = ( 総レコード数 / ページ内レコード数 + 1 ) × ページ長 × 安全率 = ( 30000 / 859 + 1 ) × 32768 × 1.3 = ( 35 + 1 ) × 32768 × 1.3 (注3) = 1533542.4 (バイト) ≒ 1498 (K バイト) → 1504 (K バイト) (注4)注1) 可変長列がないため、可変長に関する項はすべて0で計算
注2) 小数点切捨て
注3) 35は(30000/859)を小数点切上げで計算
注4) スペース量をページ長の整数倍に補正
例2
RANDOM構造のスペース量の見積り次のような構造の発注表(総レコード数:30000件)の所要スペース量を計算します。
CREATE TABLE STOCKS.発注表 ( 取引先 SMALLINT NOT NULL, 取引製品 SMALLINT NOT NULL, 仕入価格 INTEGER, 発注数量 SMALLINT, PRIMARY KEY ( 取引先, 取引製品 ) )格納構造は、次のように設計します。また、クラスタキーはPRIMARY KEY(一意性制約が設定されている)であるため、計算式は、RANDOM構造(クラスタキーに一意性制約が設定されている場合)を使用します。
格納構造:取引先と取引製品をクラスタキーとしたRANDOM構造
ページ長:プライム部、オーバフロー部ともに4Kバイト
プライム部の使用率:0.5
オーバフロー部の使用率:0.2
オーバフロー率:0.2
安全率:1.3
レコード長 = ( 仕入価格 + 発注数量 ) + ( 可変長列の数 × 4 + 6 ) + ( 取引先 + 取引製品 + 12 ) + ナルタグ数 + 26 = ( 4 + 2 ) + ( 0 × 4 + 6 ) + ( 2 + 2 + 12 ) + 2 + 26 = 56 ページ内レコード数 = ( ページ長 − 94 ) / レコード長 (注1) = ( 4096 − 94 ) / 56 = 71.46428571… ≒ 71 (注2) プライム部スペース量 = (( 総レコード数 / ページ内レコード数 ) / プライム部の使用率 + 1 ) × プライム部のページ長 = (( 30000 / 71 ) / 0.5 + 1 ) × 4096 = ( 423 / 0.5 + 1 ) × 4096 (注3) = 3469312 (バイト) = 3388 (K バイト) [ページ数 = 3388 / 4 = 847 2n ≧ 847 → n = 10 目安ページ数 = 210 + 1 = 1025] (注4) = 1025×4k → 4100 (K バイト) オーバフロー部スペース量 = (( 総レコード数 × オーバフロー率 / ページ内レコード数 ) / オーバフロー部の使用率 + 1 ) × オーバフロー部のページ長 × 安全率 = (( 30000 × 0.2 / 71 ) / 0.2 + 1 ) × 4096 × 1.3 = ( 85 / 0.2 + 1 ) × 4096 × 1.3 (注5) = 2268364.8 (バイト) → 2216 (K バイト) (注6)注1) プライム部オーバフロー部ともにページ長が等しいためページ内レコード数も同じ
注2) 小数点切捨て
注3) 423は(30000/71)を小数点切上げで計算
注4) ページ数を2の巾乗化
注5) 85は(30000×0.2/71)を小数点切上げで計算
注6) スペース量をページ長の整数倍に補正
例3
OBJECT構造のスペース量の見積り次のような構造の製品写真(総レコード数:3000件)の所要スペース量を計算します。
CREATE TABLE STOCKS.製品写真 ( 製品番号 SMALLINT PRIMARY KEY NOT NULL , 製品写真 BLOB( 500K ) NOT NULL)格納構造:OBJECT構造
ページ長:32Kバイト
安全率:1.3
論理レコード長 = 製品番号 + 製品写真 = 2 + 512000 = 512002 格納レコード長 = ページ長 − 144 = 32768 − 144 = 32624 1 論理レコード 必要ページ数 = 論理レコード長 / 格納レコード長 = 512002 / 32624 = 15.7 ≒ 16 (注) スペース量 = ( 1論理レコード必要ページ数 × 総レコード数 + 1 ) × ページ長 × 安全率 = ( 16 × 3000 + 1 ) × 32768 × 1.3 = ( 48001 ) × 32768 × 1.3 = 1996841.6 (K バイト) ≒ 1950 (M バイト)注) 小数点切上げ
例4
BTREE構造のスペース量の見積り次のような構造の発注表(SEQUENTIAL構造/総レコード数:30000件)に対して、仕入価格と発注数を2次キーとしてインデックスを付加する場合の所要スペース量を計算します。
CREATE TABLE STOCKS.発注表 ( 取引先 SMALLINT NOT NULL, 取引製品 SMALLINT NOT NULL, 仕入価格 INTEGER, 発注数量 SMALLINT, PRIMARY KEY ( 取引先, 取引製品 ) )格納構造:仕入価格と発注数量を2次キーとしたBTREE構造
ページ長(データ部):16Kバイト
ページ長(インデックス部):2Kバイト
使用率(データ部):0.5
使用率(インデックス部):0.5
圧縮率(データ部):0.3
圧縮率(インデックス部):0.5
【データ部】 エントリ長 = ( 仕入価格 + 発注数量 ) × ( 1 − キー圧縮率 ) + 20 = ( 4 + 2 ) × ( 1 − 0.3 ) + 20 ≒ 25(注1) セクション長 = エントリ長 × 10 + 2 = 25 × 10 + 2 = 252 ページ内セクション数 = ( データ部のページ長 − 110 ) / セクション長 = ( 16384 − 110 ) / 252 ≒ 64(注2) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × データ部の使用率 = ( 252 / 25 ) × 64 × 0.5 ≒ 10 × 64 × 0.5 (注3) = 320 データ部のページ数 = 表のレコード数 / ページ内エントリ数 = 30000 / 320 = 93.75 ≒ 94(注1) データ部のスペース量 = ( データ部のページ数 + 1 ) × データ部のページ長 × 安全率 = ( 94 + 1 ) × 16384 × 1.3 = 2023424 (バイト) = 1976 (K バイト) → 1984 (K バイト)(注4)注1) 小数点切上げ
注2) 小数点切捨て
注3) (252/25)は小数点切捨て
注4) スペース量をページ長の整数倍に補正
【インデックス部】 エントリ長 = ( 仕入価格 + 発注数量 + 12 ) × ( 1 − キー圧縮率 ) + 10 = ( 4 + 2 + 12 ) × ( 1 − 0.5 ) + 10 = 19 セクション長 = エントリ長 × 10 + 2 = 19 × 10 + 2 = 192 ページ内セクション数 = ( インデックス部のページ長 − 110 ) / セクション長 = ( 2048 − 110 ) / 192 ≒ 10(注1) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × インデックス部の使用率 = ( 192 / 19 ) × 10 × 0.5 ≒ 10 × 10 × 0.5 = 50(注2) インデックスレベル = L → 以下の条件を満たす値 ( ページ内エントリ数 ) L ≧ データ部のページ数 50L ≧ 94 = 2 インデックスレベル インデックス部のページ数 = Σ ( データ部のページ数 / (ページ内エントリ数i )) i=1 2 = Σ ( 94 /( 50i )) i=1 = ( 94 / 50 ) + ( 94 / 50 / 50 ) ≒ 2 + 1(注3) = 3 インデックス部のスペース量 = ( インデックス部のページ数 + 1 ) × インデックス部のページ長 × 安全率 = ( 3 + 1 ) × 2048 × 1.3 = 10649.6 (バイト) ≒ 11 (K バイト) → 12 (K バイト)(注4)注1) 小数点切上げ
注2) (192/19)は小数点切捨て
注3) 小数点切上げ
注4) スペース量をページ長の整数倍に補正
列のデータ属性 |
長さ(バイト) |
|
---|---|---|
固定長 |
CHARACTER(n) |
n |
NATIONAL CHARACTER(n) |
n × 2 |
|
NUMERIC(p,q) |
j (注1) |
|
DECIMAL(p,q) |
j (注1) |
|
SMALLINT |
2 |
|
INTEGER |
4 |
|
REAL |
4 |
|
DOUBLE PRECISION |
8 |
|
TIMESTAMP |
7 |
|
DATE |
4 |
|
TIME |
3 |
|
INTERVAL YEAR(p) |
m (注2) |
|
INTERVAL MONTH(p) |
m (注2) |
|
INTERVAL DAY(p) |
m (注2) |
|
INTERVAL HOUR(p) |
m (注2) |
|
INTERVAL MINUTE(p) |
m (注2) |
|
INTERVAL SECOND(p) |
m (注2) |
|
可変長 |
CHARACTER VARYING(n) |
a (注3) |
NATIONAL CHARACTER VARYING(n) |
a × 2 (注3) |
|
BLOB(nk) |
b × 1024 + 6(注4) |
注1) jはpの値に依存して以下の値になります。
pの値(精度) |
j |
---|---|
1 〜 2 |
1 |
3 〜 4 |
2 |
5 〜 6 |
3 |
7 〜 9 |
4 |
10 〜11 |
5 |
12 〜14 |
6 |
15 〜16 |
7 |
17 〜18 |
8 |
注2) mはpの値に依存して以下の値になります。
pの値 |
m |
---|---|
1 〜2 |
2 |
3 〜4 |
3 |
5 〜9 |
5 |
注3) aは平均文字数です。最大n文字となります。
注4) bは平均データ長(バイト)です。最大nキロバイトとなります。
目次 索引 |