4.4 データベースの構成要素
データベースサーバがデータベースを管理するために使用する表領域を指します。
SYSTEM表領域
データベース作成時に作成されます。
データベース内のすべてのオブジェクトに関する定義情報をもちます(データディクショナリ)。
システム表領域のサイズは、Oracleのオプション製品の数とユーザ作成のストアドプロシージャの量によって決まります。
特にオプション製品を選択せず、ストアドプロシージャも作成しない場合は、約200MBで作成されます。
通常200MBから500MBくらいまでの間で設定し、調整します。
SYSAUX表領域
SYSTEM表領域の補助表領域としてOracle10gから登場しました。
セッションごとに実行されるSQLの各種統計情報を、デフォルトでディスク上のSYSAUX表領域に書き込んでいます。
パラメータを設定することによって、統計情報の取得を制御できます。
制御できるのは、統計情報の詳細レベル、保持期間、統計差分を取得する間隔です。
格納するログ情報によって、ディスク容量は大量に必要になりますので、チューニングの必要性を考慮して適切なパラメータを設定する必要があります。
UNDO表領域
更新前の状態に戻すための処理を、トランザクション単位で管理します。
OLTP系(更新が多い)システムでは、更新前情報を書き込むため、IOが頻繁になる可能性が高くなります。
Oracle8iまでは、表領域に管理者が明示的にRBS(ロールバックセグメント)を作成する必要がありました。
ロールバックセグメントの設計は、パフォーマンスに関係する部分が多いため、若干補足説明をします。
Oracle9iからは自動UNDO管理機能が追加され、管理者がロールバックセグメントを作成する必要はなくなり、サーバが自動的にロールバックセグメントを作成し、エクステントサイズの拡張などの管理を自動的に行います。
自動UNDO管理を実装する場合には、以下の設定を行います。
- UNDO表領域の作成
- 初期パラメータの設定
UNDO_TABLESPACE=表領域名 UNDO_MANAGEMENT=AUTO
UNDO_SUPRESS_ERRORS=TRUE UNDO_RETENTION=n(秒)
ロールバックセグメントを作成する場合には、次の点に注意して設計を行います。
- ロールバックセグメントの数
ピーク時の同時接続セッション数÷4 - ロールバックセグメントのエクステントサイズ
1トランザクションで必要なロールバック情報の領域サイズをブロック単位で切り上げて求める - ロールバックセグメント当りのエクステント数
10から20個(エクステントの拡張をおこさないための数) - 長いトランザクション用のロールバックセグメントは別に作成して、トランザクション開始時に明示的にロールバックセグメント名を指定して使用する
ALTER SESSION SET use_rollback_segment=RBS名;
UNDO表領域もローカル管理表領域として作成します。UNDO表領域のサイズは、100MB以上、最低でも、作成されるテーブルのうち最も大きいサイズの表の大きさを指定します。
一時表領域
メモリ上(PGA)でソートできないような大規模なソートが発生した場合、ソート結果を一時的にディスク上に書き出し、最終的にメモリ上でマージした結果をユーザに戻します。
頻繁に大規模なソートを行うDSS系のシステムでは、I/Oが頻発する可能性があります。
Oracle8i以降の一時表領域は、自動的にローカル管理の一時表領域を使用します。
この場合、一時表領域内で実行されるDML文はREDOエントリを生成しないため、パフォーマンス上、改善されています。
Oracle9iからは、デフォルトー時表領域を作成することができるようになりました。
これは、ユーザが大規模ソートを実行して一時表領域を使うことになった場合、明示的に各ユーザごとに一時表領域を指定しておかなくても、自動的にデフォルトー時表領域を使用することができるようになる機能です。
この機能によって、一時表領域としてSYSTEM表領域を使用するリスクを回避することができるようになりました。
一時表領域のサイズの指針としては、最低でも作成されるテーブルのうち最大サイズの表の2倍の大きさを指定してください。
また、エクステントサイズは、大容量のソートを行うための初期化パラメータSORT_AREA_SIZEの整数倍に設定します。
表サイズの求め方
物理設計では、表容量の見積りを行い、表を格納する表領域を決め、最終的には、ボリュームごとの物理ファイルの配置、容量見積り、ディスク分割を行います。
その一番元になる表容量の見積りについて説明します。
見積りに必要な情報は、表に含まれる行数(予測値)、各列の平均的な長さとデータ型、ブロック内空き領域の割合(PCTFREE:表作成時に指定するパラメータ)の3つです。
データブロック当たりに利用可能なデータ領域は、以下の式で求めます。
-(ブロックサイズ-約100バイト)×PCTFREE/100)
PCTFREEと行移行
PCTFREEの値は、ブロック内の空き容量の割合を示します。 表と索引では、この空き領域の使用方法が異なります。
表の場合、行データがUPDATEされて行長が拡張された場合に、その拡張分をブロック内に収めるために使用される空き領域として設定されます。 表によって、挿入時の行長と、後からUPDATE文によって拡張される行長の差分は異なるので表ごとに指定します。 ブロックに初めて行が挿入されるとき、空き領域で指定された部分まで行データは挿入されますが、それを超えることはありません。
PCTFREEの値はデフォルトが10%です。
行長が長くなるのに対してPCTFREEの値が小さい場合、ブロック内の空き領域は不足します。
いずれかのタイミングで、更新後の行が同じブロックに書き込めなくなると、新しいブロックに、長くなった行データを移し、そこへのボインタを元のブロックに置きます。
これを行移行と呼びます。
行移行が起きると、索引を使って行を特定しようとしたとき、該当のブロックに行はなく、移行先のブロックを走査する必要があるため、パフォーマンスが低下します。
=3+Σ(1+列値の長さ)
データ型 | 列長の計算式 | 備考 |
---|---|---|
NUMBER | 桁数÷2+1 | |
CHAR | データ型で宣言したバイト数 | CHARは固定長 |
VARCHAR2 | データ型で宣言したバイト数÷2 | およその想定値 |
DATE | 7バイト | DATE型は固定長7バイト |
データ型と列長の計算式
必要なブロック数は以下の式で求めます。
(注:実際には、最終的に求められたブロック数の10%から20%大きめに見積る)
必要なブロック数(切り上げ)=表に含まれる行数÷ブロック当たりの平均行数)
解説トレーナー