次のような構造の発注表(総レコード数:30000件)の所要スペース量を計算します。
CREATE TABLE STOCKS.発注表 ( 取引先 SMALLINT NOT NULL, 取引製品 SMALLINT NOT NULL, 仕入価格 INTEGER, 発注数量 SMALLINT PRIMARY KEY ( 取引先, 取引製品 ) )
格納構造:SEQUENTIAL構造
ページ長:32 Kバイト
CPUコア数:2
安全率:1.3
レコード長 = ( 取引先 + 取引製品 + 仕入価格 + 発注数量 ) + ( 可変長列の数 × 4 + 2 ) + 可変長列の長さ + NULLタグ数 + 26 ≒ ( 2 + 2 + 4 + 2 ) + 0 + 0 + 2 + 26 (注1) = 38 ページ内レコード数 = ( ページ長 - 94 ) / レコード長 = ( 32768 - 94 ) / 38 = 859.8421053… ≒ 859 (注2) スペース量 = ( 総レコード数 / ページ内レコード数 + CPUコア数 + 1 ) × ページ長 × 安全率 = ( 30000 / 859 + 2 + 1 ) × 32768 × 1.3 = ( 35 + 2 + 1 ) × 32768 × 1.3 (注3) = 1618739.2 (バイト) ≒ 1581 (K バイト) → 1600 (K バイト) (注4)
注1) 可変長列がないため、可変長に関する項はすべて0で計算
注2) 小数点切捨て
注3) 35は(30000/859)を小数点切上げで計算
注4) スペース量をページ長の整数倍に補正
次のような構造の発注表(SEQUENTIAL構造/総レコード数:30000件)に対して、仕入価格と発注数を2次キーとしてインデックスを付加する場合の所要スペース量を計算します。
CREATE TABLE STOCKS.発注表 ( 取引先 SMALLINT NOT NULL, 取引製品 SMALLINT NOT NULL, 仕入価格 INTEGER, 発注数量 SMALLINT, PRIMARY KEY ( 取引先, 取引製品 ) )
格納構造:仕入価格と発注数量を2次キーとしたBTREE構造
ページ長(データ部):8Kバイト
ページ長(インデックス部):8Kバイト
使用率(データ部):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 ) / セクション長 = ( 8192 - 110 ) / 252 ≒ 32 (注2) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × データ部の使用率 = ( 252 / 25 ) × 32 × 0.5 ≒ 10 × 32 × 0.5 (注3) = 160 データ部のページ数 = 表のレコード数 / ページ内エントリ数 = 30000 / 160 = 187.5 ≒ 188 (注1) データ部のスペース量 = ( データ部のページ数 + 1 ) × データ部のページ長 × 安全率 = ( 188 + 1 ) × 8192 × 1.3 = 2012774 (バイト) = 1965 (K バイト) → 1968 (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 ) / セクション長 = ( 8192 - 110 ) / 192 ≒ 42 (注1) ページ内エントリ数 = ( セクション長 / エントリ長 ) × ページ内セクション数 × インデックス部の使用率 = ( 192 / 19 ) × 42 × 0.5 ≒ 10 × 42 × 0.5 = 210 (注2) インデックスレベル = L → 以下の条件を満たす値 ( ページ内エントリ数 ) L ≧ データ部のページ数 210L ≧ 94 = 1 インデックスレベル
インデックス部のページ数 = Σ ( データ部のページ数 / (ページ内エントリ数i )) i=1
1
= Σ ( 188 /( 210i )) i=1
= ( 188 / 210 ) ≒ 1 (注3) インデックス部のスペース量 = ( インデックス部のページ数 + 1 ) × インデックス部のページ長 × 安全率 = ( 1 + 1 ) × 8192 × 1.3 = 21299.2 (バイト) ≒ 21 (K バイト) → 24 (K バイト) (注4)
注1) 小数点切上げ
注2) (192/19)は小数点切捨て
注3) 小数点切上げ
注4) スペース量をページ長の整数倍に補正