UJP - 技術情報

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

     

表サイズの見積もり

表サイズの見積もり


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(小数点以下切捨て)



広告スペース
Google