表サイズの見積もり
0.更新履歴
- 2001.05.21 新規作成
1.はじめに
このドキュメントは,Oracleのデータサイズの見積もり方法について記述するものである.
2.ブロックヘッダエリアの算出
Oracleのデータは,DB_BLOCK_SIZEで決められたブロック上に,大きく実データを格納する領域と,ヘッダを格納する領域に分けられる.
1ブロックあたりで実データが利用できるサイズを計算するためには,ブロックサイズ(DB_BLOCK_SIZE)とブロックヘッダから算出すればよい.
- V$TYPE_SIZE表からブロックヘッダの各パラーメータを表示させる..
- DB_BLOCK_SIZEを表示させる.
c:\>sqlplus system/manager@o8i.testinstall.com SQL*Plus: Release 8.1.6.0.0 - Production on Mon May 21 12:05:28 2001 (c) Copyright 1999 Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production With the Partitioning option JServer Release 8.1.6.0.0 - Production SQL> SELECT type,type_size from v$type_size 2 WHERE type IN 3 ('KCBH','KTBBH','KTBIT','KDBH','KDBT','UB1','UB4','SB2'); TYPE TYPE_SIZE -------- ---------- UB1 1 UB4 4 SB2 2 KCBH 20 KTBIT 24 KTBBH 48 KDBH 14 KDBT 4 8 rows selected. SQL> SHOW PARAMETERS db_block_size NAME TYPE VALUE ------------------------------------ ------- ------------------------------ db_block_size integer 8192 SQL> |
ブロックヘッダ領域は,次の式で算出できる
KCBH + UB4 + KTBBH + (INITRANS - 1) * KTBIT + KDBH |
※INITRANSは,ブロックあたりの同時実行トランザクションの最少数で,1〜255まで設定できるが,通常はデフォルト値の1のままで使用する.
今回の場合,上記V$TYPE_SIZEの検索結果を当てはめると,次のようになる.
20 + 4 + 48 + (1 - 1) * 24 + 14 = 86(Byte) |
このデータベースは,ブロックサイズが8192なので,このブロックで利用できるデータ量は次のとおりになる.
8192 - 86 = 8106Byte |
ちなみに,ブロック内容は次のような構成となっている.
ここで算出した領域(8106Byte)は,行ヘッダ+行データの合計値となる.
3.行データエリアの算出
各ブロック内で,行データを格納するための領域サイズは,次の式で求められる.
FREE_AREA = DB_BLOCK_SIZE - ブロックヘッダ CEIL( FREE_AREA - ( FREE_AREA * (PCTFREE / 100) ) ) - KDBT |
※FREE_AREAは,ここで計算式を簡単にするためだけに勝手に用意した変数領域. CEIL()は,計算結果を整数(小数点以下切上げ)にするもの.
SQL> SELECT type,type_size from v$type_size 2 WHERE type = 'KDBT'; TYPE TYPE_SIZE -------- ---------- KDBT 4 SQL> SHOW PARAMETERS db_block_size; NAME TYPE VALUE ------------------------------------ ------- ------------------------------ db_block_size integer 8192 SQL> |
これを前出の式に当てはめると,次のようになる.
FREE_AREA = 8192 - 86 = 8106 CEIL( 8106 - ( 8106 * (10 / 100) ) ) - 4 = 7292 |
※ここでは,PCTFREEを10%として計算した.
これで,このデータベースの場合,1ブロックあたり7292バイトをデータ領域として利用することになる.
4.表の1行当たりのデータ量計算
1行あたりのデータ量を計算するためには,まずテーブルを構成している各フィールドをどのように計算するかを知っておく必要がある.
4.1.表で定義したデータを計算する(行データ)
各列は,定義されたデータ量分のエリア+オーバヘッドで構成される.
フィールド | サイズ定義方法 |
---|---|
CHAR |
定義サイズ. |
VARCHAR2 |
実際に利用しているサイズ. |
NUMBER |
NUMBER(p,s)で定義した場合, s + CEIL(p / 2) + 1 |
DATE |
7Byte. |
オーバヘッドは次のとおりになる.
項目 | 値 |
---|---|
カラムが250Byteより小さい | 1Byte |
カラムが250Byte以下 | 3Byte |
たとえば,次のような表があったとする.
AA CHAR(10) BB VARCHAR2(100) CC NUMBER(10,3) DD DATE EE CHAR(300) |
この場合,次のような計算となる.
AA = 10 + 1 BB = 100 + 1 CC = 3 + CEIL(10 / 2) + 1 = 9 DD = 7 + 1 EE = 300 + 3 AA(11)+BB(101)+CC(9)+DD(8)+EE(303) = 432Byte |
BB列はVARCHAR2であるが,この計算では,最大バイト数となっている.
4.2.行ヘッダ
表に1行データが追加される毎に,固定長の行ヘッダエリアが必要となる.
行ヘッダの計算で利用されるパラメータ,UB1は,次のようなSQL文で表示させることができる.
SQL> SELECT type,type_size from v$type_size 2 WHERE type = 'UB1'; TYPE TYPE_SIZE -------- ---------- UB1 1 SQL> |
行ヘッダで使用する領域を求めるには,次の式で計算する.
行ヘッダ = UB1 * 3 |
4.3.行サイズ
行ヘッダと行データを足すことで,行サイズを算出できる.
行ヘッダ + 行サイズ |
前出の4.1〜4.2で利用した情報では,1行あたり次のようになる.
行ヘッダ(3) + 行データ(432) = 435Byte |
5.ブロックあたりに格納できる行数
前出の数値を利用し,単純に割ればよい.
サンプルを利用すると次のようになる.
- 1ブロックあたりに格納できるデータ量は7292Byte.
- 1行あたりのデータ量は435Byte.
1ブロックに格納できる件数 = 7292 / 435 = 16(小数点以下切捨て) |