ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

表領域の作成方法

 表領域の作成する時のノウハウについてまとめてあります。

表領域を作成、削除、拡張する方法

表領域を作成する方法

 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ログファイルを大きくすると、リカバリに時間がかかります。
 REDOログファイルを小さくすると、チェックポイントが頻繁に発生します。

ロールバックセグメントのサイズ

 ロールバックセグメントのサイズは、一般的なトランザクションのサイズによって決まります。
 大きなトランザクションの場合は、ロールバックセグメントのサイズは大きい方が、パフォーマンスは向上します。
 小さなトランザクションが多数ある場合は、小さなロールバックセグメントが多数存在する方が、パフォーマンスが向上します。

テンポラリセグメントのサイズ

 テンポラリセグメントのサイズは、ソートするデータの並びによって異なりますが、一般的には、ソートするキー項目のサイズの1.3倍のサイズが必要となります。



Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp