表領域の作成する時のノウハウについてまとめてあります。
SVRMGR(SQL*DBA)のSQLコマンドで作成します。
SVRMGR# create tablespace TBS01 datafile 'tbs01.dbf' size 100M default storage (initial 50M next 50M minextents 1 maxextents 99 pctincrease 10) online; |
SVRMGR(SQL*DBA)のSQLコマンドで削除後、UNIXの rmコマンドで削除しなければなりません。
この順序を間違えると、データベースを再構築するしかありません。
SVRMGR# drop tablespace TBS01 including contents; unix# cd ~oracle/dbs unix# rm tbs01.dbf |
表領域を拡張するためには、SVRMGR(SQL*DBA)のSQLコマンドで、データベースファイルを追加します。
一度拡張した表領域は、縮小することはできません。
もし、縮小する場合は、エキスポートしてから、表領域を再作成する必要があります。
SVRMGR# alter tablespace TBS01 add datafile 'tbs01.dbf' size 100M reuse; |
表領域の一覧は、以下のSQL文で参照できます。
SVRMGR# select * from dba_tablespaces; |
また、データベースファイルの一覧を参照するには、以下のSQL文で参照できます。
SVRMGR# select * from dba_data_files; |
作成した表領域のサイズを参照するには、下記のSQL文で、各dbfファイルのサイズを調べて合計します。
SVRMGR# select * from dba_data_files where tablespace_name='TBS01'; |
以下のように、SQL関数を使用して計算することもできます。
SVRMGR# select sum(bytes) from dba_data_files where tablespace_name='TBS01'; |
また、使用中のEXTENTのサイズは、以下のSQL関数を使用して計算できます。 これは、EXTENTのサイズなので、未使用ブロックも含まれています。
SVRMGR# select sum(bytes) from dba_extents where tablespace_name='TBS01'; |
(1)ブロックヘッダのサイズ
INITRANS=1とするとヘッダ部のサイズは以下の式となります。
Rは1ブロック内の行数を表します。
block_header = block_header_a + block_header_b
block_header = 57 + 23 * INITRANS + 4 + 2R
block_header = 80 + (4 + 2R)
(2)データブロックあたりに利用可能なデータ領域のサイズ
DB_BLOCK_SIZE=4096, PCTFREE=5とすると利用可能な領域は、以下の式となります。
available_space = (4096-block_header) - (4096-block_header_a) * 5/100
available_space = 3811 - 2R
(3)データ領域サイズ(レコードサイズ)
ORACLEの各データ型の必要なサイズを求めます。
可変長のデータは、代表値のサイズで代用します。
列のデータが250バイトを超える列はほとんどないものとします。
data_space = 列1のサイズ + 列2のサイズ + ...
各列のサイズは、属性によって以下の方法で求めます。
CHAR(size) | 固定長 | sizeバイト |
VARCHAR2(size) | 可変長 | 代表値のバイト数(最大sizeバイト) |
NUMBER(p,s) | 可変長 | 代表値のp/2[+1:指数][+1:符号]バイト(最大21バイト) |
DATE | 固定長 | 7バイト |
LONG | 可変長 | 代表値のバイト数 |
RAW(size) | 可変長 | 代表値のバイト数(最大sizeバイト) |
LONG RAW | 可変長 | 代表値のバイト数 |
ROWID | 固定長 | 6バイト |
MLSLABEL | 可変長 | 2バイトから5バイト |
レコードサイズを正確に知るには、類似したデータを登録したテスト環境を作成して調べます。
類似データがない場合は、代表値を登録して調べることもできます。
レコードサイズは以下の問い合わせで調べることができます。
SQL> SELECT AVG(NVL(VSIZE(col1),1) + AVG(NVL(VSIZE(col2),1) + ... FROM 表名;
(4)行サイズ
avg_row_size = 3 + 列数 + data_space
(5)1ブロックあたりの行数
R = available_space / max(avg_row_size, 9)
R = (3811 - 2R) / max(avg_row_size, 9)
R = 3811 / (max(avg_row_size, 9) + 2)
(6)ブロック数とバイト数
ブロック数とバイト数は、以下の式となります。
rowsは、表内の全行数を表します。
blocks_for_table = rows / R
bytes_for_table = blocks_for_table * 4096
(1)ブロックヘッダのサイズ
INITRANS=2とするとヘッダ部のサイズは以下の式となります。
block_header = 113 + 23*INITRANS
block_header = 159
(2)データブロックあたりに利用可能なデータ領域のサイズ
DB_BLOCK_SIZE=4096, PCTFREE=5とすると利用可能な領域は、以下の式となります。
available_space = (4096-block_header) - ((4096-block_header)*(5/100))
available_space = 3740
(3)データ領域サイズ(レコードサイズ)
表の場合と同様に求めます。
(4)行サイズ
avg_entry_size = 8 + 列数 + data_space
(5)1ブロックあたりの行数
R = available_space / avg_entry_size
R = 3740 / avg_entry_size
(6)ブロック数とバイト数
ブロック数とバイト数は、以下の式となります。
not_null_rowsは、表内のNULLでない行数を表します。
blocks_for_index = 1.05 * not_null_rows / R
bytes_for_index = blocks_for_index * 4096
REDOログファイルのサイズは、どのような値でも動作しますので、デフォルトでも十分です。
REDOログファイルのサイズを求める計算式はありません。
REDOログファイルを大きくすると、リカバリに時間がかかります。
REDOログファイルを小さくすると、チェックポイントが頻繁に発生します。
ロールバックセグメントのサイズは、一般的なトランザクションのサイズによって決まります。
大きなトランザクションの場合は、ロールバックセグメントのサイズは大きい方が、パフォーマンスは向上します。
小さなトランザクションが多数ある場合は、小さなロールバックセグメントが多数存在する方が、パフォーマンスが向上します。
テンポラリセグメントのサイズは、ソートするデータの並びによって異なりますが、一般的には、ソートするキー項目のサイズの1.3倍のサイズが必要となります。