9 April, 1998 Updated
PCDN OracleWG S.Yamazaki
物理設計後の容量見積もりのために、表および索引の計算方法を説明します。なお、この計算方法は、私の経験で補正しています。マニュアル記載の数値とでの違いがあることに留意して下さい。なお、この計算式が必ずしも正確でないこと、かつ、挿入データの実値のばらつきによる必要容量との相違があることに注意して下さい。
| 表領域の見積り |
|---|
容量を正確に見積もるためには、ORCALEのブロック構造、データの内部格納形式を知る必要がありますが、ここでは、その説明は省き次の手順で進めていきます。
(このブロック構造についてはここでは、詳しく説明いたしませんので、4.1.2「データブロック、エクステント、セグメント」をご覧ください。)
ブロックヘッダーの計算
まず、各ブロックには必ず、表・行情報などを格納するためのヘッダー領域があります。
以下の公式によって求めて下さい。
|
ブロックヘッダー(O_head) = KCBH + UB4 + KTBBH + (INITRANS - 1) * KTBIT + KDBH |
1ブロックで使用できるデータ領域の計算
次に、1ブロックで使用できる領域を計算します。これは、1ブロックのサイズから、ブロックヘッダーとPCTFREE値によって取られた領域を差し引いた領域にあたります。
以下の公式によって求めてください。
|
使用可能領域/ブロック(B_space) = 切上げ((DB_BLOCK_SIZE - O_head) * (1 - PCTFREE/100)) + KDBT( or UB4) |
1行に必要な領域の計算
次に、実際に挿入されるデータの1行あたりの領域の計算です。単に列サイズの合計だけでなく、データ型による列情報値もあわせて計算します。以下の公式で求めてください。
列サイズの合計(C_Size)
NUMBER型 = (1 + 切捨て(格納時の桁数/2)) + 1
DTAE型 = 7
CHAR型 = 桁数 + (255以下なら 1、以上なら 3)
VARCHAR2型 = 格納時の桁数 + (桁255以下なら 1、以上なら 3)
を計算して合計します。
|
1行の領域(Row_space) = 3 * UB1 + C_Size + SB2 |
1ブロックに格納できる行数と必要ブロック数の計算
さて、以上の結果より、以下のように1ブロックに格納できる行数が求められます。これにより、実際に挿入しようとする行数から何ブロック必要かがわかると思います。
|
行数/ブロック(Row_Count) = 切捨て(B_Space / Row_Space) |
|
必要ブロック数 = 切上げ(挿入する実際の行数 / Row_Count) |
必要ブロック数が算出されたことで、あとはDB_BLOCK_SIZEを掛けることによって、ある程度のバイト数も算出できることと思います。
これらの値を調整して、CREATE TABLE ... STORAGE句での、INITIAL,MINEXTENT値に適用することができます。
実際に数字を入れて計算した例をご覧ください。
ブロックヘッダー(O_Head)=
KCBH(20) +- UB4(4) + KTBBH(48) + (INITRANS(2) - 1) * KTBIT(24) + KDBH(14) = 110
使用可能領域/ブロック(B_space) =
切上げ((DB_BLOCK_SIZE(2048) - 110) * (1 - PCTFREE(20)/100)) + KDBT(4) = 1554
列サイズの合計(C_Size) = 27バイトだと仮定します。
1行の領域(Row_space) = 3 * UB1(1) + C_Size(27) + SB2(2) = 32
行数/ブロック(Row_Count) = 切捨て(B_Space(1554) / Row_Space(32)) = 48
必要ブロック数 = 切上げ(挿入する実際の行数(10000) / Row_Count(48)) = 208
となります。
ただし、この計算は初期テーブル作成時のEXTENT割り当て、連鎖行発生などによって大きく変動する可能性もあります、この計算で得られた数値はINITIALパラメーターに指定すると良いでしょう。
また、実際のデータを使用して試すことが出来る場合は、実際にテーブルに挿入して算出された方がより正確な数値を得ることができると思います。({DBA|ALL|USER}_SEGMENTS表で確認できます)
| 索引領域の見積り |
|---|
次に索引の容量を見積もります。基本的には表領域と似ていますが、索引ブロック独自の格納のされ方があります。これは、ブランチブロックで必要な領域及び内部断片化率に左右されるためです。次の手順で計算してください。
ブロックヘッダーの計算
表領域のヘッダーと違う計算です。以下の式によって求めて下さい。
|
ブロックヘッダー(O_head) = 固定長ヘッダー(113) + (INITRANS * 24) |
1ブロックで使用できるデータ領域の計算
次に、表領域と同じように1ブロックで使用できる領域を計算します。以下の式によって求めてください。
|
使用可能領域/ブロック(B_space) = 切上げ((DB_BLOCK_SIZE - O_head) * (1 - PCTFREE/100)) |
索引列の平均結合列長の計算
これは、索引列の平均長で計算されるほかは、表領域の「1行に必要な領域の計算(C_size)」と同じです。
1エントリに必要な平均索引サイズの計算
次に1索引エントリに格納できる平均索引サイズを計算します。次の式で計算します。
|
平均索引サイズ(Entry_Size) = エントリヘッダー(2) + ROWID長(6) + F_size + V_size + 平均結合列長(C_size) |
必要ブロック数の計算
これにより、実際に格納された場合の必要ブロック数を計算します。ただし、最初に述べたようにブランチブロックの余分な領域(5%)と、内部断片化率を係数により調整して算出してください。
|
ブロック数(Block_Count) = 1.05 (Null値を除く行数 * Entry_Size) / (切上げ(B_Space / Entry_Size) * Entry_Size) |
上で算出されたブロック数に内部断片化率をかけることにより、妥当なサイズを算出できると思います。内部断片化率については、私の経験からは10〜15%程度必要と感じていますが、各々の索引の構成により変動させて算出されるとよいでしょう。
| その他の領域管理 |
|---|
索引を作成するときには、一時表領域が使用されます。この時ソートに必要な領域は、索引サイズを上回る事になりますので、大きい索引を作成するときは一時表領域のサイズにも注意する必要があります。なお、NOSORTオプションを付けた索引では一時表領域が使用されることはありません。
また、表・索引のほかにもクラスタ化された表を利用している場合は、その領域の見積もりも必要となってくるでしょう。ここでは見積もり方法は述べませんが、表領域等の見積もり方法とは大きく考え方が違っていますので、安易に見積もると連鎖行が多く発生したり、無駄な領域ができる要因にもなりますので注意が必要と思います。
クラスタ領域の管理方法は3.6.1「クラスタ表とクラスタ索引」の中で簡単に説明していますので参考にしてください。