• 検索結果がありません。

領域サイズの見積方法

N/A
N/A
Protected

Academic year: 2021

シェア "領域サイズの見積方法"

Copied!
23
0
0

読み込み中.... (全文を見る)

全文

(1)

領域

域サ

サイ

イズ

ズの

の見

見積

積も

もり

り方

方法

考慮

慮事

事項

項お

およ

よび

び記

記憶

憶領

領域

域パ

パラ

ラメ

メー

ータ

タの

の設

設定

White Paper

(2)

領域サイズ見積もり方法

1998年 3 月 初版

1998年 7 月 改訂版 NULL列のオーバーヘッドに関する項目を追加

1998年 9 月 改訂 2 版 リリース 8.03 マニュアルの内容を反映

日本オラクル株式会社 Design & Migration Services 著作権 ©Oracle Corporation Japan 1998

版 版版 版権権権権所所所所有有有 有   Printed in Japan この文書は情報の提供のみを意図したもので、ここに記載され た情報は予告なしに変わることがあります。文書中に万一誤り など、お気付きの点がありましたら、ご連絡をお願いいたしま す。オラクル社は、この情報を一切保証するものではなく、こ の文書に関するいかなる責任も負いかねますのでご了承くだ さい。

Oracle and SQL*Loader are registered trademarks. Oracle7は Oracle Corporation の商標です。

上記以外の製品名あるいは会社名はいずれも、製品を指し示す だけの目的で使用しており、その製品等を推奨するものではあ りません。また、各所有者の商標である場合もあります。

(3)

領域

域サ

サイ

イズ

ズ見

見積

積も

もり

り方

方法

考慮

慮事

事項

項と

と記

記憶

憶領

領域

域パ

パラ

ラメ

メー

ータ

タの

の設

設定

はじ

じめ

めに

この資料では、特定のオブジェクトの領域を概算する際に役立つ公式を説明し ます。また、計算結果を目安として、オブジェクトを作成する時のパラメータの 選び方と注意事項についても説明します。なお、この資料は以下のセクションに 分かれています。 · 表サイズの見積もり · 索引サイズの見積もり · 記憶領域パラメータ値の設定と注意事項 · おわりに オブジェクトの領域の大きさを見積もることにより、作成するオブジェクトを 格納するために必要なディスク容量を決定することができます。また、記憶領域 パラメータを適切に設けることにより、Oracle の機能が最大限に発揮されない 原因となるI/Oのパフォーマンスを改善することができます。 ここで説明する見積もり方法を理解するためには、データ・ブロック、エクス テント、セグメント、表領域といった Oracleの論理データベース構造、および 記憶領域単位についての知識が必要です。Oracle の論理データベース構造、お よび記憶領域単位については『Oracle8 Server 概要』第2章「データ・ブロッ ク、エクステント、セグメント」を参考にしてください。 DMSグループでは、本書で説明する計算方法を用い、自動的に表および索引 サイズを計算する EXCEL アプリケーション・ツール「領域サイズ見積シート」を 提供しています。本書での見積もり方法を理解した上で、本書とともに実際の見 積作業にお役立てください。

(4)

表サ

サイ

イズ

ズの

の見

見積

積も

もり

ここでは、表サイズを見積もる方法を説明します。クラスタ表やインデックス 構成表、オブジェクト・テーブルは含まれません。ここで算出される値は、理想 な状態でデータが格納された場合の理論値です。実際には削除や更新があるので、 理想的な状態で格納されるわけではありません。この計算値を最低限必要な値と 考え、10∼20%大きめに見積ってください。 表サイズの見積に必要な情報を以下に示します。 l 表の行数 l 各列の平均的な長さとデータ型 l データ・ブロック・サイズ l PCTFREE、INITRANSの値 l V$TYPE_SIZE中の値 以下の手順に従って、表の大きさを見積もります。 1. ブロック・ヘッダ領域サイズを計算します。 2. データ・ブロック当たりの利用可能なデータ領域サイズを計算します。 3. 行あたりに利用される領域サイズを計算します。 4. データ・ブロックに格納可能な平均行数を計算します。 5. 表に必要なブロック数とバイト数を計算します。 計 算 を 実 行 す る 前 に 、 表 お よ び 索 引 サ イ ズ の 計 算 に 必 要 と な る 定 数 を V$TYPE_SIZEを検索して取得しておきます。

例 Windows95、Oracle8 Personal Edition Release 8.0.4.0.0 での V$TYPE_SIZE 検索結果

SQL> select type, type_size from v$type_size

2 where type in ('KCBH','UB4','KTBBH','KTBIT','KDBH','KDBT','UB1','SB2'); TYPE TYPE_SIZE --- ---UB1 1 UB4 4 SB2 2 KCBH 20 KTBIT 24 KTBBH 48 KDBH 14 KDBT 4 8行が選択されました。; 本書の表および索引の見積計算例では、これらの値を使用します。

(5)

1.

.ブ

ブロ

ロッ

ック

ク・ヘッダ領域サイズの計算

・ヘッダ領域サイズの計算

・ヘッダ領域サイズの計算

・ヘッダ領域サイズの計算

データ・ブロックの構成を図 1 に示します。データ・ブロックには、まずブロ ック・ヘッダが格納されます。そしてヘッダ以降の領域中、PCTFREEの値によ って決定される利用可能領域に行データが格納されます。 PCTFREE:現行ブロック更新のために確保する領域の割合。 行 デデデ ーデーー タータタタ 行 ヘヘヘッヘッッダッダダダ 利利 利 用用用用可可可可能能能能領領領域領域域域 共共 共 通通通通ヘヘヘッヘッッダッダダダ ((K((KKKCCCCBBBBHHH)H))) 固固 固定定定定 トトトラトララランンンンザザクザザクククシシシショョョョンンンン・ヘヘッ・・・ヘヘッッダッダダダ ((((KKTKKTTBBTBBBBHBBHH)H))) 可変変ト変変トトラトララランンザンンザザクザクククシショシショョンョンンン・ヘッヘ・ヘ・・ヘッッッダダダダ ((

(KKTKKTTBTBBIIIIT BT * T T * * * ((((IIIINNNNIIIITTRTTRRRAAANANSNNSSS----1111)))))))) デデ デ ーーーー タタタタ・・・・ヘヘヘヘッッッダッダ (ダダ (((KKKKDDBDDBBHBHHH)))) 表デデ ィデディィィレレレクレクトククトトリトリリ (リ (((KKDKKDDDBBBTBTTT****表表表表数数数数 )))) U U U UBBBB4444 図 図図 図1::::デデデーデーターータタタ・・・ブ・ブロブブロロッロッッックククク形形形式形式式式 ブロック・ヘッダ領域が必要とするサイズは、次の公式によって算出できます。 ブ ブブ ブロロロッロッックックク・ク・・ヘ・ヘッヘヘッッッダダダダ領領領領域域域域 = ==

KCBH + UB4 + KTBBH + (INITRANS - 1) * KTBIT + KDBH

ここで、 KCBH、、、、UB4、、、、KTBBH、、、、 KTBIT、、、、KDBH :V$TYPE_SIZEを検索することで得られる定数 INITRANS :割り当てられたトランザクション・エントリの初 期数。この値は1∼255までの範囲内であり、デ フォルト値は1となります。通常このデフォルト 値を変更することはありません。 例 INITRANS = 1 と仮定してヘッダーサイズを計算します。 ブロック・ヘッダ領域

= KCBH + UB4 + KTBBH + (INITRANS - 1) * KTBIT + KDBH = 20 + 4 + 48 + (1-1) * 24 + 14 = 86 (Byte) INITRANS はブロックあ たりの同時実行トランザ ク シ ョ ン の 最 小 数 で あ り、テーブルあたりの値 ではありません。

(6)

2.

.利

利用

用可

可能

能領

領域

域サ

サイ

イズ

ズの

の計

計算

各ブロック内で、行データを格納するために確保されている利用可能データ領 域のサイズは、次の公式によって算出されます。PCTFREEはブロック・ヘッダ A 以降の領域に対する割合なので、(ブロック・サイズ − ブロック・ヘッダ) *(PCTFREE / 100)で求められる領域をブロック・ヘッダ以降の領域から差し 引くことで利用可能領域のサイズを算出します。 利 利 利 利用用用用可可可可能能能能デデーデデーーータタタ領タ領領域領域域域 = = = =CEIL((((((((ブブブブロロロロッックッッククク・・・・ササササイイイイズズズズ −−−− ブブロブブロロッロッックック・クク・・ヘ・ヘヘッヘッッダッダダ)ダ))) − −− −((((((((ブブブブロロロロッッッックク・サクク・サイ・サ・サイイイズズズズ −−−− ブブブブロロッロロッックックク・ヘク・ヘッ・ヘ・ヘッッッダダダダ))))*((((PCTFREE / 100)))))))))))) − −− − KDBT = = = =CEIL((((((((ブブブブロロッロロッッッククク・ク・サ・・サササイイイイズズズズ −−−− ブブブブロロッロロッックッククク・・・ヘ・ヘッヘヘッッッダダダダ))))*((((1 −−−− PCTFREE / 100)))))))) − −− − KDBT ここで、 CEIL :計算結果が整数になるように切り上げる。 PCTFREE :現行ブロック更新のために確保する領域の割合。 KDBT :V$TYPE_SIZEを検索することで得られる定数。

例 Windows95、Oracle8 Personal Edition Release 8.0.4.0.0 での v$parameter 検索結果

SQL> select name, value from v$parameter where name='db_block_size'; NAME ---VALUE ---db_block_size 2048 例 PCTFREE = 10、ブロック・サイズ = 2048、KDBT = 4 と仮定します。 またステップ 1 の例より、ブロック・ヘッダ = 86 とします。 利用可能データ領域 =CEIL((ブロック・サイズ - ブロック・ヘッダ) *(1 - PCTFREE / 100))- KDBT =CEIL((2048 − 86) * (1 − 10 / 100)) - 4 =CEIL(1962 * 0.9) - 4 = 1766 - 4 = 1962(Byte) PCTFREE で確保される 行 の 更 新 の た め の 領 域 は、利用可能領域に含め ません。 ブロック・サイズは、デ ータベース作成時に決定 します。初期化パラメー タ DB_BLOCK_SIZE で 指定できます。

(7)

3.

.行

行あ

あた

たり

りに

に使

使

使わ

使

われ

れる

る領

領域

域サ

サイ

イズ

ズの

の計

計算

行あたりに使用される領域サイズを求める最も簡単な方法は、サンプル表を作 成し、各列に対して、(vsize(colname))を選択するか、そのテーブルにANALYZE をかけ、データディクショナリ(USER_TABLESのAVG_ROW_LEN)を見るこ とです。

例 visize(colname)を使用して Windows95、Oracle8 Personal Edition Release 8.0.4.0.0 にデフォルトで作成される scott.emp 表の平均行サイズを求めてみ ます。

SQL> desc emp;

名前 NULL? タイプ ---

EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 各列の平均サイズは次のように求めることができます。 SQL> select avg(vsize(empno)) empno,

2 avg(nvl(vsize(ename), 0)) ename, 3 avg(nvl(vsize(job), 0)) job, 4 avg(nvl(vsize(mgr), 0)) mgr, 5 avg(nvl(vsize(hiredate), 0)) hiredate, 6 avg(nvl(vsize(sal), 0)) sal, 7 avg(nvl(vsize(comm), 0)) comm, 8 avg(nvl(vsize(deptno), 0)) deptno 9 from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---2.9285714 5 6.8571429 2.7857143 7 2.4285714 .5 2

平均的行サイズは次のように求めることもできます。 SQL> select (avg(vsize(empno)) + avg(nvl(vsize(ename), 0)) 2 + avg(nvl(vsize(job), 0)) + avg(nvl(vsize(mgr), 0)) 3 + avg(nvl(vsize(hiredate), 0)) + avg(nvl(vsize(sal), 0)) 4 + avg(nvl(vsize(comm), 0)) + avg(nvl(vsize(deptno), 0)) ) 5 average_row_size 6 from emp; AVERAGE_ROW_SIZE 29.5 これより、この表の平均行的サイズは約 30 バイトだとわかります。

(8)

データブロックに格納される、表の行データ構造を図2に示します。各行には 固定長の行ヘッダがあり、それぞれにオーバーヘッドを含む各列データ領域が続 いて存在します。 行 ヘヘヘヘッッッッダダダダ バイバババイイイトトト長ト長長長をを含をを含含含むむむむ 列列列 サ列サイササイイズイズズズのののの和和和和 オオ オ ーーーー ババババーー ヘーーヘヘヘッッッッドドドド 列 デデデデ ーーーー タタタタ 図 図 図 図 22:22:::行行行の行の要のの要要素要素素素 計算で表の平均的行サイズを求める場合、いくつかのステップがあります。最 初に、バイト長を加えた、列のデータ領域サイズを計算する方法を説明します。 バイト長を含む列のデータ領域サイズは、列のデータ領域にオーバーヘッドを加 えることで算出できます。 バ バ バ バイイトイイトトト長長長長をを含をを含含む含むむむ列列列デ列デーデデーータータタ領タ領領域領域サ域域ササイサイイズイズズズ = = =

column size ++++ overhead

column size:列のデータ領域 CHAR :定義した長さ VARCHAR2 :実際に占有している長さ NUMBER :定義した長さ(精度)をpとすると、次の式で計算でき ます。 1(指数部)+ CEIL(p / 2) + 1(有効数字が38桁未満の負数の場合のみ) DATE :7Byte CEIL:計算結果が整数になるように切り上げます。 overhead:各列に割り当てられるオーバーヘッド column sizeが250Byte以下の時:1

column sizeが250Byte以上の時:3

次の公式を用いて行サイズを計算します。行サイズは固定長の行ヘッダにバイ ト長を含む列データ領域サイズの和を加えて算出します。 行 行 行 行ササササイイイイズズズズ = = = = 行 行 行 行ヘヘヘヘッッッッダダーダダーーー((((3 * UB1)+)))+++ ババババイイトイイトトト長長長長をを含をを含含含むむむむ列列デ列列デデーデーーータタタタ領領域領領域域域ササササイイズイイズズのズのの和の和和和 UB1:V$TYPE_SIZEを検索することで得られる定数 行連鎖が生じた場合、オ ーバーヘッドの領域が増 加します。

(9)

例 列 1:CHAR(15)、列 2:DATE、列 3:NUMBER(10) の 3 列が表に設定されてい ると仮定します。

列1:CHAR(15)

バイト長を含む列データ領域サイズ = column size + overhead = 15 + 1 = 16 (Byte)

列2:DATE

バイト長を含む列データ領域サイズ = column size + overhead = 7 + 1 = 8 (Byte) 列3:NUMBER(10)

バイト長を含む列データ領域サイズ = column size + overhead = 6 + 1 = 7 (Byte) 例 以上の列データ領域サイズの和を用いて、行サイズを計算します。 行サイズ = 行ヘッダー(3 * UB1) + バイト長を加えた列データ領域サイズの和 = 3 * 1 + (16 + 7 + 8) = 34 (Byte) これで、次の計算式を用いて行あたりに使用される領域サイズを計算できます。 行 行行 行あああたあたたりたりにりりにに使に使使使用用用用さされさされれれるるるる領領領領域域サ域域サササイイイイズズズズ = ==

MAX((((UB1*3 ++++ UB4 ++++ SB2, 行サ行行行ササイサイイズイズ)ズズ))+)+++ SB2

ここで、

MAX((((A, B)))) :AかBの大きい方の値を採用します。

UB1、、、、UB4、、、、SB2 :V$TYPE_SIZEを検索することで得られる定数。

例 既に計算した値より、行サイズ = 35 と仮定すると、行あたりに使用される 領域サイズは次のように計算されます。

行あたりに使用される領域サイズ

= MAX(UB1*3 + UB4 + SB2, 行サイズ)+ SB2 = MAX(1*3 + 4 + 2, 34)+ 2

(10)

4.

.ブ

ブロ

ロッ

ック

クあ

あた

たり

りの

の平

平均

均行

行数

数の

の計

計算

ブロックあたりの平均行数を次の公式を用いて求めます。ブロックあたりの平 均行数は、利用可能領域を行あたりに使用される領域サイズで割ることで計算で きます。 ブ ブ ブ ブロロロロッッッッククあククあああたたたたりりのりりののの平平平平均均均行均行行数行数数数 = = =

= FLOORFLOORFLOORFLOOR((((利利利利用用用用可可可可能能領能能領領域領域域域 / 行あ行行行あああたたたりたりにりりにに使に使使用使用用さ用さされされれるれる領るる領領域領域域域ササイササイイイズズズズ))))

ここで、 FLOOR FLOORFLOOR FLOOR:計算結果が整数になるように切り捨てる。 例 ステップ 2 より、利用可能領域サイズ = 1762、 ステップ 3 より、行あたりに使用される領域サイズ = 36 とし、 ブロックあたりの平均行数を計算します。 ブロックあたりの平均行数 = FLOOR(利用可能領域 / 平均的行サイズ) = FLOOR(1762 / 36) = 48(行)

5.

.必

必要

要な

なブ

ブロ

ロッ

ック

ク数

数と

とバ

バイ

イト

ト数

数の

の計

計算

次の公式を用いて、必要なブロック数、及びバイト数を算出できます。必要な ブロック数は、表に含まれる行数をブロックあたりに格納できる平均行数で割る ことで求められます。必要なブロック数にブロック・サイズをかけたものが、必 要なバイト数となります。 必 必 必 必要要要要ななななブブブブロロッロロッッックククク数数数数 = = = = CEIL((((表表表表にににに含含含含ままれままれれれるるるる行行数行行数数数 / / / / ブブロブブロロロッッックッククあクああたあたたりたりのりりのの平の平平均平均行均均行行数行数数数)))) 必 必 必 必要要要要ななななババイババイイイトトトト数数数数 = = = = 必必必必要要要要ななななブブロブブロロロッッッックククク数数数 数 * * ブ* * ブブロブロロッロッックック・クク・・サ・ササイサイイイズズズズ 例 表が 20,000 行含むと仮定します。 ステップ 4 より、ブロックあたりの平均行数 = 50 として 必要なブロック数、及びバイト数を計算します。 必要なブロック数 = CEIL(表に含まれる行数 / ブロックあたりの平均行数) = CEIL(20000 / 48) = 417 必要なバイト数 = 必要なブロック数 * ブロック・サイズ = 417 * 2048 = 854016 (Byte) = 0.81 (MB)

(11)

索引

引サ

サイ

イズ

ズの

の見

見積

積も

もり

Oracleでは、索引も表と同様にセグメントとして扱われます。つまり、索引を 作成すると、索引のための領域が必要になります。そのため、索引を定義する場 合は、索引に必要な領域を考慮に入れなければなりません。 索引ブロックの構成は、基本的には本書3ページの図1:データブロック形式 と同じです。しかし、索引ブロックにはリーフ・ブロック、ブランチ・ブロック があり、それぞれ構造が異なります。このため索引サイズの見積は、表サイズの 見積よりも複雑で困難なものとなります。本書では索引ブロック構造の詳細には 触れません。本書で説明する見積方法は、簡略化したブロック構造をもとにして います。また、すべての索引ブロック構造が等しいと仮定しています。あくまで も、見積結果は目安と考え、10∼20%は余裕を持った領域を割り当てるようにし てください。 索引サイズの見積もり方法は、表の見積もりと類似しています。見積もりに必 要な情報を以下に示します。 l 索引の行数(NULL値は含まない) l 索引列の平均的な長さとデータ型 l データ・ブロック・サイズ l PCTFREE、INITRANSの値 l V$TYPE_SIZEから検索する定数 以下の手順に従って、索引に必要となる領域の大きさを見積もります。 1. データ・ブロック当たりのブロック・ヘッダー・サイズを計算します。 2. データ・ブロック当たりの利用可能な索引データ領域を計算します。 3. 索引あたりに利用される領域サイズを計算します。 4. ブロックあたりの平均索引エントリ数の計算 5. 索引に必要なブロック数とバイト数を計算します。

1.

.ブ

ブロ

ロッ

ック

ク・ヘッダー・サイズの計算

・ヘッダー・サイズの計算

・ヘッダー・サイズの計算

・ヘッダー・サイズの計算

索引ブロック構造を簡略化したものを図3に示します。固定部と可変部から なるブロック・ヘッダ以降の領域中、PCTFREEの値によって決定される利用可 能領域に索引エントリが格納されます。 固固 固定定 長定定長長長ヘヘヘヘッッダッッダダ (ダ(((11111113133バ3バイババイイイトトトト)))) 可変可可可変変変長長長ト長トラトトラランランンンザザザザククシククシショショョンョンン・ンヘヘッ・・ヘ・ヘッッッダダダダ (( (22224444ババババイイイイトトトト / / / / INITRANS値値 )値値))) ブブ ブロロロッロッッックククク・ヘヘッ・・ヘ・ヘッッダッダダダ この計算方法は、索引を 構 成 す る 列 の 平 均 的 長 さに依存します。そのた め、索引列の実際のデー タ 長 が 比 較 的 一 定 で あ る場合、この見積もり計 算式は、より正確なもの になります。

(12)

次の公式により、索引データ・ブロック・ヘッダーに必要な領域を計算します。 ブロック・ヘッダは固定部と可変部を加えることで求められます。 ブ ブ ブ ブロロロロッッッックククク・・ヘ・・ヘヘヘッッッダッダダーダーーー = = = = 固定固固固定定定長長長長ヘヘヘヘッッッッダダーダダーーー ++++ 可変可可可変変長変長長ト長トラトトラランランンンザザザザクククシクシシショョョョンン・ンン・・・ヘヘヘヘッッッッダダダダーーーー 固 固固 固定定定長定長長ヘ長ヘヘヘッッダッッダダダーーーー :113バイト 可 可可 可変変変変長長長ト長トラトトララランンンザンザザザククシククシシショョョョンンン・ン・ヘ・・ヘヘッヘッッッダダダダ ー ーー ー :24 * INITRANS 例 INITRANS = 2 と仮定します。 ブロック・ヘッダ = 固定長ヘッダ + 可変長トランザクション・ヘッダ = 113 + 24 * 2 = 161 (Byte)

2.

.ブ

ブロ

ロッ

ック

クあ

あた

たり

りの

の利

利用

用可

可能

能な

なデ

デー

ータ

タ領

領域

域の

の計

計算

次の公式を用いて、索引に割り当てることができるデータ領域を計算します。 PCTFREEはブロック・ヘッダ以降の領域に対する割合なので、ブロック・サイ ズからブロック・ヘッダを引いた領域に(1 − (PCTFREE / 100))をかけた ものが利用可能領域サイズとして算出されます。 利 利 利 利用用用用可可可可能能能能デデーデデーーータタタ領タ領領域領域域域 = = = = (ブ(((ブブブロロロッロッッックククク・サイズ・サイズ・サイズ・サイズ −−−− ブブロブブロロッロッックック・クク・・・ヘヘヘヘッッダッッダダ)ダ)))****((((1 −−(−−(((PCTFREE / 100)))))))) 例 ステップ 1 より、ブロック・ヘッダ = 161、 また PCTFREE = 10、ブロック・サイズ = 2048 と仮定して、データ・ブロッ クあたりの利用可能領域サイズを計算します。 利用可能データ領域 = (ブロック・サイズ − ブロック・ヘッダ) * (1 − (PCTFREE / 100)) = (2048 − 161) * (1 − 10 / 100) = 1887 * 0.9 = 1698.3 = 1699 (Byte)

3.

.全

全体

体の

の索

索引

引値

値サ

サイ

イズ

ズの

の計

計算

データブロックに格納される、索引エントリ構造を図4に示します。各エント リには固定長のエントリ・ヘッダとROWIDデータ領域があり、それぞれにオー バーヘッドを含む各索引列データ領域が続いて存在します。 索 引引 エ引引エエエンンンントトトリトリリリ・ヘヘッ・ヘヘ・・ッッダッダダダ ババイババイイイトト長トト長長長をををを含含む含含むむむ 索索索索 引引 列引引列列 サ列サササイイズイイズズズのののの和和和和 ROWID オ ーーーー ババババーー ヘーーヘヘヘッッッッドドドド 列 デデデデ ーーー タータタタ 図 図 図 図 44:44:::索索索引索引引引エエエンエントンントトトリリリ構リ構構構成成成成 INITRANSの値は表のそ れと違い、最小値とデフ ォルト値は1ではなく2 です。

(13)

平均索引サイズを計算する前に、バイト長を加えた、索引列のサイズを計算す る必要があります。バイト長を含む索引列のデータ領域サイズは、索引列のデー タ領域にオーバーヘッドを加えることで算出できます。 バ ババ バイイイトイトト長ト長長を長をを含を含含含むむ索むむ索索索引引引引列列サ列列サササイイイイズズズズ = ==

column size ++++ overhead

column size:索引列のデータ領域

表の領域サイズの計算方法ステップ3を参考にしてください。

overhead:各列に割り当てられるオーバーヘッド column sizeが127Byte以下の時:1

column sizeが127Byte以上の時:2

次の公式を用いて索引行サイズを計算します。索引行サイズは固定長の行ヘッ ダにバイト長を含む列データ領域サイズの和を加えて算出します。 索 索索 索引引引行引行行サ行ササイサイイズイズズズ = == = 行ヘ行行行ヘヘッヘッッダッダーダダーーー((((3 * UB1)+)))+++ ババババイイトイイトト長ト長長を長を含をを含む含含むむ列む列列デ列デーデデーータータタ領タ領域領領域域域ササササイイズイイズズズのののの和和和和 UB1:V$TYPE_SIZEを検索することで得られる定数 例 索引が CHAR(15)、NUMBER(10) の 2 列で構成されていると仮定します。 CHAR(15) バイト長を含む索引列サイズ = column size + overhead = 15 + 1 = 16 (Byte) NUMBER(10)

バイト長を含む索引列サイズ = column size + overhead = 6 + 1 = 7 (Byte) 例 以上の索引列データ領域サイズの和を用いて、索引行サイズを計算します。 索引行サイズ = 行ヘッダー(3 * UB1) + バイト長を加えた索引列データ領域サイズの和 = 3 * 1 + (16 + 7) = 26 (Byte) これで、次の計算式を用いて行あたりに使用される領域サイズを計算できます。 索 索索 索引引行引引行行あ行ああたあたりたたりりりにににに使使使使用用さ用用ささされれれれるるるる領領域領領域域域ササササイイイイズズズズ = ==

MAX((((UB1*3 ++++ UB4 ++++ SB2, 索索引索索引行引引行サ行行ササイサイイズイズ)ズズ)))++++ SB2

ここで、

MAX((((A, B)))) :AかBの大きい方の値を採用します。

(14)

例 既に計算した値より、索引行サイズ = 26 と仮定すると、索引行あたりに使 用される領域サイズは次のように計算されます。

索引行あたりに使用される領域サイズ

= MAX(UB1*3 + UB4 + SB2, 索引行サイズ)+ SB2 = MAX(1*3 + 4 + 2, 26)+ 2 = MAX(9, 26)+ 2 = 28(Byte) 次の公式を用いて索引エントリ・サイズを計算します。索引エントリ・サイズ は固定長索引エントリ・ヘッダとROWIDデータ領域、長さバイトにバイト長を 含む索引列データ領域サイズの和を加えて算出します。 全 全 全 全体体体体のののの索索索索引引値引引値値値サササイサイイズイズズズ = = = = エエエンエンンントトリトトリリリ・ヘッダー・ヘッダー・ヘッダー・ヘッダー ++++ ROWIDのの長のの長長さ長さ+ささ+++ F ++++ V + ++ + 索引索索索引引引行行行行ああたああたたりたりりりにににに使使使使用用さ用用ささされれれれるるるる領領域領領域域域ササササイイイイズズズズ ここで、 エ エ エ エンンンントトトトリリリリ・ヘッダー・ヘッダー・ヘッダー・ヘッダー :2バイト ROWIDのの長のの長長さ長さささ :6バイト F :長さバイト = 127 バイト以下のデータを格納するための列数 * 1 V :長さバイト = 128 バイト以上のデータを格納するための列数 * 2 例 既に計算した値より、索引行あたりに使用される領域サイズ = 30 と仮定す ると、全体の索引値サイズは次のように計算されます。 全体の索引値サイズ = エントリ・ヘッダー + ROWIDの長さ+ F + V + 索引行あたりに使用される領域サイズ = 2 + 6 + (2 * 1 + 0 * 2) + 28 = 38 (Byte)

4.

.ブ

ブロ

ロッ

ック

クあ

あた

たり

りの

の平

平均

均索

索引

引エ

エン

ント

トリ

リ数

数の

の計

計算

次の公式を用いてブロックあたりの平均索引エントリ数を算出します。ブロッ クあたりの平均索引エントリ数は、利用可能領域を平均的索引エントリ・サイズ で割ることで計算できます。 ブ ブ ブ ブロロロロッッッッククククああたああたたたりりりりのののの平平均平平均均索均索索引索引引エ引エンエエンントントトリトリリ数リ数数数 = = = = FLOOR (利利用利利用用可用可能可可能能領能領領域領域域域 / 全体全全全体体の体のの索の索索引索引値引引値値値ササササイイイイズズズズ) FLOOR:計算結果が整数になるように切り捨てます。 例 ステップ 2 より、利用可能データ領域サイズ = 1699、 ステップ 3 より、全体の索引値サイズ = 40 として 平均行数を計算します。 ブロックあたりの平均索引エントリ数 = FLOOR (利用可能領域 / 平均的索引エントリ・サイズ) = FLOOR (1699 / 38) = 44 一 意 で な い 索 引 の 場 合 は、ROWID が別の列と 見なされて、長さバイト が 1 必要になります。

(15)

5.

.必

必要

要な

なブ

ブロ

ロッ

ック

ク数

数と

とバ

バイ

イト

ト数

数の

の計

計算

次の公式を用いて、必要なブロック数、及びバイト数を算出できます。必要な ブロック数は、表に含まれるnullでない索引の行数を 1.05 で乗してから、ブロ ックあたりに格納できる平均索引エントリ数で割ることで求められます。必要な ブロック数にブロック・サイズをかけたものが、必要なバイト数となります。 必 必必 必要要な要要ななブなブブロブロッロロッックックク数ク数数数 = == = CEIL(((( 1.05 * 1.05 * 1.05 * 1.05 * nullで なでででななな いいいい 索索索索 引引 の引引ののの 行行行行 数数数数 / / / / ブブブブ ロロロロ ッッ クッッククク ああああ たたたた りり のりりののの 平平平平 均均均均 索索 引索索引引引 エエエエ ンンンン トト リトトリリ 数リ数数 )数))) 必 必必 必要要要な要ななバなバイババイイトイトト数ト数数数 = == = 必 必必要必要要な要ななブなブロブブロロッロッックッククク数数数数 * * * * ブブブブロロロロッッッックク・クク・・・ササササイイイイズズズズ 例 ステップ4より、ブロックあたりの平均索引エントリ数 = 42 とします。ま た、索引付きの表の内、索引を構成する列の値が null でない行が 20,000 行 あると仮定します。 必要なブロック数 = CEIL (1.05 * nullでない索引の行数 / ブロックあたりの平均索引エントリ数) = CEIL (1.05 * 20000 / 44) = 478 必要なバイト数 = 必要なブロック数 * ブロック・サイズ = 478 * 2048 = 978944 (Byte) = 0.93 (MB) ロードする表に対して、索引を作る時、索引をソートするために一時セグメン トが作成されます。索引のソートに必要な領域は一定ではありませんが、索引サ イズの 110%にまでなる可能性があります。

関連

連事

事項

項:

:ビ

ビッ

ット

トマ

マッ

ップ

プ索

索引

引サ

サイ

イズ

ズの

の推

推測

ビットマップ索引のサイズを厳密に測定、または、見積もることはできません。 しかし、表のB*ツリー索引のサイズに対して、相対的にビットマップ索引サイ ズを推測することはできます。ここではその推測方法についの説明は省略します が、『Oracle8 Server チューニング』 第 10 章「データ・アクセス方法」 -ビ ット・マップ索引の使用方法- に推測方法例がありますので、参照してください。 乗数 1.05 は索引のブラ ンチ・ブロックで必要な 領 域 を 追 加 す る た め の ものです。 NOSORT オプションを CREATE INDEXコマン ドで指定すると、一時領 域は必要ありません。た だし、クラスタ索引を作 り時には、このオプショ ンを指定できません。

(16)

記憶

憶領

領域

域パ

パラ

ラメ

メー

ータ

タの

の設

設定

定と

と注

注意

意事

事項

記憶領域(STORAGE)パラメータは、表および索引等のスキーマ・オブジェ クト、および表領域の記憶特性を指定するもので、表領域に指定された値は、そ の表領域に割り当てられたセグメントに対する STORAGEパラメータのデフォ ルト値になります。また STORAGEパラメータは、データベースのデータへの アクセス時間とデータベース内での領域利用の効率性の両方に影響します。 ここでは次に示す、一般的な記憶領域パラメータの値の選び方と、その上で考 慮すべき注意事項について説明します。 l INITIAL l NEXT l MAXEXTENTS l MINEXTENTS l PCTINCREASE またここで説明する注意事項は次の通りです。 l パラレル・ロードとINITIALの値 l データ領域見積もりの際の平均行長誤差 l エクステントについて

記憶

憶領

領域

域パ

パラ

ラメ

メー

ータ

ター

ーの

の設

設定

各記憶領域パラメータについての説明と、一般的値を示します。 INITIAL 推奨値 :必要なバイト数 デフォルト :5データ・ブロック 設定可能値 :OS依存 セグメントに割り当てられる最初のエクステントのサイズをバイト単位で指 定します。KまたはMを使用して、KBまたはMB単位でもサイズを指定できま

す。ALTER TABLEのstorage句でINITIALを指定してその値の変更することは

できません。指定した値が5データ・ブロック未満のとき、データ・ブロックの 倍数のサイズに切り上げられ、5データ・ブロック以上の時は 5 データ・ブロッ クの倍数のサイズに切り上げられます。 パフォーマンスを低下させる可能性がある動的拡張を避けるには、オブジェク トに含まれるデータがすべてこのエクステントに収まるのが理想的です。そのた め、パラレル・ロードなど特殊な機能を使用する時以外は、計算によって求めた データ領域に必要なバイト数を指定するのが一般的です。しかし、初期データ量 は少ないが時間とともに急激にデータが増えてしまうようなシステムでは、初め から巨大なエクステントを確保する必要はありません。また、全表走査以外の検 索、つまりインデックス走査では表のエクステントがフラグメントしていても、 それほどパフォーマンスに影響を与えません。これらのように、必ずしもこの推 奨値が理想的でない場合もあります。

(17)

NEXT 推奨値 :INITIALの値の10%程度 デフォルト :5データ・ブロック 設定可能値 :OS依存 INITIALで指定したエクステントがいっぱいになった場合に割り当てられるエ クステントのサイズをバイト単位で指定します。KまたはMを使用して、KBま たはMB単位でもサイズを指定できます。INITIALの一般値に対してのNEXTの

推奨値を示しました。ALTER TABLESPACEのstorage句でNEXT値を変更する

ことは可能ですが、その値は次の増分エクステントから適用され、既に割り当て られたエクステントに変更は起きません。指定した値が5データ・ブロック未満 のとき、データ・ブロックの倍数のサイズに切り上げられ、5データ・ブロック 以上の時は断片化を最小限にする値に切り上げられます。 MAXEXTENTS 推奨値 :UNLIMITEDまたは最大エクステント数より少し小さめ デフォルト :OS依存 設定可能値 :1 − OS依存 最大エクステント数 データ・ブロックのサイズ 最大エクステント数 2048バイト 121 4096バイト 249 8192バイト 505 セグメントに割り当てられるエクステントの総数を指定します。Oracle7.3か らは、UNLIMITEDを指定できます。UNLIMITEDと指定することにより最大エク ステント数は2Gとなり、ほぼエクステントの割り当て制限がなくなります。そ れ以前のOracleでは最大エクステント数より少し小さな値を指定しましょう。 表または索引がMAXEXTENTSを上回った場合でも、表や索引を動的に変更し、 最適なサイズのNEXTエクステントを割り当てる機会を残しておくためです。 例 EXAMPLE 表が最大エクステント数より小さい MAXEXTENTS(100)に達したが、表 領域にはまだ空があるとします。

ALTER TABLE EXAMPLE STORAGE(MAXEXTENTS 110, NEXT 5M);

MINEXTENTS 推奨値 :デフォルトの値 デフォルト :1 設定可能値 :1 − OS依存 セグメント作成時に割り当てられるエクステントの総数を指定します。特殊な 場合以外は、デフォルト値のままにしましょう。 PCTINCREASE 推奨値 :0 デフォルト :50 ロールバック・セグメン ト の UNLIMITED 指 定 は、正式サポートの対象 外となります。 セ グ メ ン ト に エ ク ス テ ン ト の 最 大 数 が 割 り 当 てられた後も、さらに領 域 が 必 要 に な っ た 場 合 は、そのオブジェクトの 再 編 成 を 行 わ な け れ ば なりません。

(18)

例 「表領域の見積もり」の例で算出した表 データ・ブロック・サイズ:2048(Byte) 必要なブロック数:426 必要なバイト数が 872448 (Byte) を作成するための CREATE TABLE 文例を示します。 必要なバイト数を 10%多めに見積もります。 872448 * 1.1 = 959693 (Byte) ≒ 1 (MB) CREATE TABLE example(

name CHAR(15), today DATE, id NUMBER(10) )STORAGE( INITIAL 1M, NEXT 100K, MAXEXTENTS UNLIMITED, MINEXTENTS 1, PCTINCREASE 0 );

注意

意事

事項

記憶領域パラメータ設定の際に役立つ注意事項を説明します。

パラ

ラレ

レル

ル・

・ロ

ロー

ード

ドと

INITIAL

の値

テキスト・ファイルのデータをデータベースの表に取り入れるためのユーティ リティとして、SQL*Loaderがあります。その機能の一つにパラレルロードがあ ります。パラレルロードは、データファイルを複数に分けることで、複数ファイ ルに対して同時に、そして高速なデータ・ローディングを可能にします。パラレ ルロードを行う場合、INITIALの値を小さくしてください。パラレルロードの際、 それぞれのローディングで新たにエクステントを確保することから、最初に作成 されるエクステントが使用されず、INITIALで確保する領域が無駄になるからで す。 例 データのパラレルロードは次のように行います。

%sqlldr DATA=example1.dat DIRECT=true PARALELL=TRUE FILE=/dev/D1 %sqlldr DATA=example2.dat DIRECT=true PARALELL=TRUE FILE=/dev/D2 ...

%sqlldr DATA=example10.dat DIRECT=true PARALELL=TRUE FILE=/dev/D10 例 example 表に必要な領域が約 1000MB のとき、10 個のデータファイルを用いて

パラレルロードを行う時の INITIAL および NEXT の設定例です。 CREATE TABLE example(

name CHAR(15), today DATE, id NUMBER(10) )STORAGE( INITIAL 64K, NEXT 100MB, MAXEXTENTS UNLIMITED, MINEXTENTS 1, PCTINCREASE 0 )PARALELL (DEGREE 10);

(19)

デー

ータ

タ領

領域

域見

見積

積も

もり

りの

の際

際の

の平

平均

均行

行長

長誤

誤差

可変

変長

長デ

デー

ータ

タ型

型に

につ

つい

いて

VARCHAR2型の列データ領域は、定義された長さではなく、格納されたデー タが占有する長さになります。例えば、VARCHAR2(100)と定義された列に格納 されたデータが‘ABC’であれば、列長は100ではなく3バイトです。このよ うに、VARCHAR2型を含む平均行長の見積もりの際は、定義された長さと実際 に格納されたデータの長さによって生じる誤差に注意しなくてはいけません。特 に定義されたVARCHAR2型の列長が長い時、誤差は顕著になるでしょう。 NUMBER型の列データについてもVARCHAR2型の場合と同様です。定義さ れた長さより、実際に格納される数値データの長さに注意して見積もりを行うべ きです。

NULL

列の

のオ

オー

ーバ

バー

ーヘ

ヘッ

ッド

ドに

につ

つい

いて

NULL値を含む列のオーバーヘッドのサイズには注意が必要です。オーバーヘ ッドのサイズは 1 列に対して 1 バイトですが、表の最終列まで連続するNULL列 のオーバーヘッドは 0 だからです。例えば次に定義する表NULLTESTがありま す。

create table nulltest ( col1 char(10) not null, col2 char(10) not null, col3 char(10), col4 char(10), col5 char(10)); CHAR型は固定長データ型なので行ヘッダー、オーバーヘッドを含む平均的行 サイズは次のように計算できます。 平均的行サイズ = 3 + 1 + 10 + 1 + 10 + 1 + 10 + 1 + 10 + 1 + 10 = 58 byte 実際に次のSQL文を実行し平均行長を求めてみます。

SQL> insert into nulltest values('test','test','test','test','test'); 1 行が作成されました。

SQL> insert into nulltest values('test','test','test','test','test'); 1 行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> analyze table nulltest compute statistics for table; 表が分析されました。

SQL> select avg_row_len from user_tables where table_name = 'NULLTEST'; AVG_ROW_LEN

58

(20)

しかし実際に次の SQL 文を実行して平均行長を求めると、 SQL> truncate table nulltest;

表が切り捨てられました。

SQL> insert into nulltest(col1, col2, col3, col4)

values('test','test','test','test'); 1 行が作成されました。

SQL> insert into nulltest(col1, col2, col3, col4)

values('test','test','test','test'); 1 行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> analyze table nulltest compute statistics for table; 表が分析されました。

SQL> select avg_row_len from user_tables where table_name = 'NULLTEST'; AVG_ROW_LEN 47 となり、計算値より 1 バイト少ない 47byteとなります。これは最終行の第 5 列 がNULLのためオーバーヘッドが 0byteとなるからです。同様に第 3 列、第 4 列、 第 5 列がNULLであるとき、平均的行サイズの計算値は、 平均的行サイズ = 3 + 1 + 10 + 1 + 10 + 1 + 0 + 1 + 0 + 1 + 0 = 28 byte ではなく、3 列分のオーバーヘッドの少ない、 平均的行サイズ = 3 + 1 + 10 + 1 + 10 + 0 + 0 + 0 + 0 + 0 + 0 = 25 byte となります。実際に次のSQL分を実行し確認してみます。

SQL> truncate table nulltest; 表が切り捨てられました。

SQL> insert into nulltest(col1, col2) values('test','test'); 1 行が作成されました。

SQL> insert into nulltest(col1, col2) values('test','test'); 1 行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> analyze table nulltest compute statistics for table; 表が分析されました。

SQL> select avg_row_len from user_tables where table_name = 'NULLTEST'; AVG_ROW_LEN 25 次に第 3 列と第 5 列がNULLである場合を考えます。最終列の第 5 列がNULL のとき、そのオーバーヘッドは 0byteでした。では同じNULL列でも連続してい ない場合のオーバーヘッドはどうなるでしょうか。このときの平均行長を次の SQL文を実行して求めます。

(21)

SQL> truncate table nulltest; 表が切り捨てられました。

SQL> insert into nulltest(col1, col2, col4) values('test','test','test'); 1 行が作成されました。

SQL> insert into nulltest(col1, col2, col4) values('test','test','test'); 1 行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> analyze table nulltest compute statistics for table; 表が分析されました。

SQL> select avg_row_len from user_tables where table_name = 'NULLTEST'; AVG_ROW_LEN 37 これは、第 3 列のオーバーヘッドを 0 でなく、1byteとした次の計算結果と一致 します。 平均的行サイズ = 3 + 1 + 10 + 1 + 10 + 1 + 0 + 1 + 10 + 0 + 0 = 37 byte

つまり、NULLでない列に挟まれたNULL列は 1byteのオーバーヘッドをもつが、

最終列まで連続するNULL列にはオーバーヘッドがありません。存在する複数列 の内の一部の列しか使用しないような特殊な表を見積もるときは、使用しない NULL 列のオーバーヘッドの大きさに注意して領域の見積もりを実行してくだ さい。

エク

クス

ステ

テン

ント

トに

につ

つい

いて

データ・ベース・オブジェクトが作成されたとき、また、既存の領域(セグメ ント)が満杯になると、新しいエクステントが割り当てられます。割り当てられ たエクステントの解放は、DELETEによっては行われません。エクステントが解 放されるのはDROPもしくはTRUNCATEだけです。

複数

数デ

デー

ータ

タフ

ファ

ァイ

イル

ルへ

への

のエ

エク

クス

ステ

テン

ント

ト割

割り

り当

当て

エクステントの割り当てはOracleによって自動的に行われます。一つの表領 域に複数のデータファイルがある場合も同様で、割り当て先のデータファイルは Oracle により自動的に選択されます。この時、一つのエクステントが複数のデ ータファイルをまたがって割り当てられることはありません。すなわち、データ ファイルに空領域が残っていても、そのサイズが一つのエクステントのサイズよ り小さければ、使用されません。例えば、あるデータファイルの空領域サイズが 900Kバイトあり、もう一つのデータファイルには 800Kバイトの空領域がある とします。このとき、次に割り当てられるエクステントのサイズが1Mバイトで あったら、この2つの空領域は合計サイズ1.7Mバイトにもかかわらず使用され ないのです。エクステントのサイズが大きい時、データファイル中で、未使用と なる空領域のサイズも大きくなる可能性があります。 ロールバック・セグメン ト の 記 憶 領 域 パ ラ メ ー ターにOPTIMALを指定 すると、エクステントの 解放が、Oracleにより動 的に行われます。

(22)

明示

示的

的な

なエ

エク

クス

ステ

テン

ント

ト割

割り

り当

当て

エクステントの割り当ては通常Oracleによって自動的に行われますが、次の 例のように新しいエクステントを明示的に割り当てることができます。明示的に 割り当てることで、空領域を有効に使うことができます。また複数データファイ ルを使用している時はI/Oのバランスを調節することもできます。 例 example 表にサイズ 500K バイトの新しいエクステントを example02.ora とい ううデータファイル中に割り当てます。

SQL> alter table example allocate extent

2 (size 500k datafile 'C:¥ORAWIN95¥DATABASE¥example02.ora'); 表が変更されました。

フラ

ラグ

グメ

メン

ンテ

テー

ーシ

ショ

ョン

エクステントは連続するデータベース・ブロックの集まりです。すなわち、エ クステントを割り当てるのに必要な空領域は同じ表領域内で連続していなくて はいけません。例えば、一つの表領域内に500Kバイトと600Kバイトの空領域 があったとしても、それらが連続していなければ、1Mバイトのエクステントを 割り当てることはできません。このような状態が表領域のフラグメンテーション です。IMPORT/EXPORT ユーティリティを使用すれば表領域のフラグメンテー ションを解消することができます。

(23)

おわ

わり

りに

この資料では、表と索引という特定のオブジェクトの領域を概算する際に役立 つ公式について解説しました。また、その計算結果を目安として、オブジェクト を作成する時のパラメータの選び方と考慮すべき注意事項についても説明しま した。サイズの見積もりは有効ですが、計算結果は近似値であることを注意して、 この資料をデータベース設計に役立ててください。

参照

関連したドキュメント

機能(目的) 設定方法 画面で見るマニュアル 参照先.. 便利な使い方.

REC DATA MASTER L to SD CARD REC DATA MASTER R to SD CARD VOLUME SOUND

 医薬品医療機器等法(以下「法」という。)第 14 条第1項に規定する医薬品

注:一般品についての機種型名は、その部品が最初に使用された機種型名を示します。

未記入の極数は現在計画中の製品です。 極数展開のご質問は、

問55 当社は、商品の納品の都度、取引先に納品書を交付しており、そこには、当社の名称、商

の知的財産権について、本書により、明示、黙示、禁反言、またはその他によるかを問わず、いかな るライセンスも付与されないものとします。Samsung は、当該製品に関する

弊社または関係会社は本製品および関連情報につき、明示または黙示を問わず、いかなる権利を許諾するものでもなく、またそれらの市場適応性