連載
» 2005年03月30日 00時00分 UPDATE

ORACLE MASTER Silver DBAポイント解説(5):記憶領域構造とUNDOデータの管理

[小野寺智子,@IT]

これまで連載してきた「ORACLE MASTER Goldポイント解説」では第4回までは「PL/SQL」を解説し、第5回以降にDBAの解説を行っている。しかし、2003年10月の資格制度の変更に合わせ、連載タイトルを「新ORACLE MASTER Silver DBAポイント解説」に変更する。そのため、本連載は「ORACLE MASTER Goldポイント解説」で紹介した内容を確認したうえでお読みいただきたい。


 今回は、前回(「第4回 Oracleの表領域の管理」)解説した表領域の内部構造であるセグメント、エクステント、データ・ブロックについて解説いたします。今回の内容は、前回解説した表領域の構造を頭に入れていると、理解するのが早いと思います。また、Oracle9iからの新機能として、UNDOデータの管理を解説いたします。

記憶領域構造

 記憶領域構造については前回の表領域と同じく、論理的構造、つまりOracle側から見た構造を説明します。記憶領域構造というと難しいような感じを受けますが、Oracleが格納するデータを整理して、使用別にさまざまな領域に格納していると考えると難しくないと思います。例えば、机の中にある文具などを分かりやすいように格納しておけば、すぐに取り出しやすいのと同じかと思います。

●セグメントの種類と特性

 Oracleの表領域がどのような構造になっているか、前回の図をここで再度掲載しますので、もう1度確認してください(図1)。

図1 表領域の構成 図1 表領域の構成

 前回解説したように、セグメントはいくつかのエクステントが集まって構成されています。つまり、Oracleの中に存在する表などのオブジェクトでは、そのオブジェクトを構成するエクステントがすべて集まり、セグメントを構成しているということです。Oracleには、さまざまな種類のセグメントがあります。このセグメントの種類と特性はしっかり覚えてください。

セグメントの種類 特性
ユーザーのデータなどを格納する一般的なセグメント
表パーティション 表をいくつかに分割して、データを格納するセグメント。データ量が多く、検索が多い場合に適している
クラスタ 表と同様のデータ・セグメント。クラスタ内の行はキー列値に基づいて格納される
索引 検索速度を上げるために、列のキー値を格納するセグメント
索引構成表 表と索引を合わせたようなセグメント。キー値の索引に基づいてデータを格納する
索引パーティション 表パーティションと同じく、いくつかに分割して索引の情報を格納するセグメント
UNDOセグメント データを変更した際に、変更前のデータを一時的に格納するセグメント
一時セグメント データのソート時に、メモリサイズを超えて処理するような場合に、ソートの中間結果を一時的に格納するセグメント
LOBセグメント 画像データなどラージオブジェクトを格納するセグメント
ネストした表 表内の列を表として扱うセグメント
Bootstrapセグメント データベース作成時にsql.bsqというスクリプトによって作成されるセグメント
表1 セグメントの種類とその特性

●記憶領域パラメータの優先順位

 セグメントを構成しているエクステントが、どのようにセグメントに割り当てられるかを制御するために、記憶領域パラメータを使用します。なお、記憶領域パラメータがどのような順序で使用されるかは以下のとおりです。

優先順位 記憶領域パラメータ
1 表領域レベルで指定したUNIFORMSIZEやローカル管理ではAUTOALLOCATEの値、ディクショナリ管理ではMINIMUMEXTENTの値
2 セグメントレベルで指定した記憶領域パラメータ
3 表領域レベルで指定した記憶領域パラメータ
4 OracleServerのデフォルトの記憶領域パラメータ
表2 記憶領域パラメータの優先順位

●データ・ブロック

 データ・ブロックはOracleが扱う論理的なI/Oの最小単位です。データ・ブロックは1つ以上のOSブロックから構成されています。データ・ブロックは図2のように、大きく分けると「ブロックヘッダ」「空き領域」「データ領域」の3つの層から構成されています。ブロックヘッダには、データ・ブロックのアドレス情報などが格納されています。データ領域には、行データが格納されています。空き領域はデータ・ブロックの中央にあり、データ領域とブロックヘッダの領域拡張のために確保している領域です。

図2 データ・ブロックの内容 図2 データ・ブロックの内容

 データ・ブロックのこれらの領域を制御するには、以下のパラメータを使用します(表3)。INITRANS、MAXTRANSはブロックヘッダ部分のトランザクションの情報を制御し、PCTFREEとPCTUSEDは行データ領域の使用率を制御します。

パラメータ パラメータの説明
INITRANS データ・ブロックに割り当てられるトランザクションスロットの初期値を指定。デフォルト値は、データ・セグメントは1、索引セグメントは2
MAXTRANS データ・ブロックを更新する同時トランザクションの最大数を指定。デフォルト値は255。値の範囲は1〜255
PCTFREE データ・ブロック内の空き領域をどのくらい確保するかを指定する。デフォルト値は10%
PCTUSED 一度PCTFREEに達したデータ・ブロックに再度挿入が行われたとき、新規データを受け入れるかどうかの基準になる使用領域割合の値を指定。デフォルト値は40%。ただし、自動セグメント領域管理にした場合は、この値は無視される
表3 データ・ブロック領域管理のためのパラメータ

●データ・ブロックの空き領域管理

 Oracle9iから、データ・ブロックの空き領域管理を自動で行うことができるようになりました。Oracle8iまでは、表3で紹介したパラメータPCTFREEとPCTUSEDに、セグメントに割り当てられているデータ・ブロックの中で、挿入可能なブロックを示すリストの数を指定するパラメータFREELISTSを使用して手動で管理を行っていました。

 Oracle9iからは、表領域作成時に、「SEGMENT SPACE MANAGEMENT AUTO」を指定することで自動セグメント領域管理のモードになります。空き領域の管理は従来の空きリストを使用してのものではなく、ビットマップを使用しての管理になります。ただし、自動セグメント領域管理に指定できるのは、ローカル管理の永続表領域のみです。自動セグメント領域管理に設定するとPCTFREEやPCTUSEDのパラメータ値は無視されます。

 また、データ・ブロックの3つの領域を適切に設定することによって、「行移行」(図3)や「行連鎖」(図4)といったパフォーマンスに影響を及ぼす動作をなくすことができます。

図3 行移行 図3 行移行
図4 行連鎖 図4 行連鎖

●記憶領域に関するデータ・ディクショナリ・ビュー

 表領域、データ・ファイル、セグメント、エクステントなどに関する情報はデータ・ディクショナリ・ビューから取得することができます。それらのデータ・ディクショナリ・ビューは以下のとおりです(表4)。

取得したい情報 データ・ディクショナリ・ビュー
表領域の情報 DBA_TABLESPACES
データ・ファイルの情報 DBA_DATA_FILES
セグメントの情報 DBA_SEGMENTS
エクステントの情報 DBA_EXTENTS
空きエクステントの情報 DBA_FREE_SPACE
表4 記憶領域である表領域、データ・ファイル、セグメント、エクステント間の情報を格納しているデータ・ディクショナリ・ビュー

●UNDOセグメントの管理

 UNDOセグメントは、Oracle8iまではロールバック・セグメントと呼ばれ、データに矛盾がない状態を保ち、読み取り一貫性を実現する役割を持ったセグメントです。Oracle9iからはUNDOセグメントと呼ばれるようになり、自動管理ができるようになりました。以前までは、ロールバック・セグメントの領域が足りなくなった場合、領域を手動で追加したり、領域を割り当てたりしましたが、Oracle9iからはOracle Serverが自動的に管理してくれます。silverDBAの試験では自動で管理する方法を問われます。手動で管理する方法は、試験範囲に含まれないため、説明を割愛させていただきます。

●UNDOセグメントの役割

 UNDOセグメントの自動管理の内容を説明する前に、UNDOセグメントにはどのような役割があるのかを説明します。

 UNDOセグメントは、トランザクションが発生し、データの変更が行われると、変更中のデータが確定されるまで変更前のデータを格納します。何らかの原因で変更中のデータが確定されなかった場合は、UNDOセグメントに格納していた変更前のデータを戻します。また、変更途中のデータにほかの人がアクセスした場合、まだ確定していないデータを参照させることは大変危険です。ですから、確定している以前のデータを参照できるようにするためにも、以前のデータを格納しておく必要があります。

図5 UNDOセグメントの役割 図5 UNDOセグメントの役割

●自動UNDOの管理

 自動UNDO管理に設定した場合は、UNDOセグメントの名前はOracle Serverによって命名されます。また、手動UNDO管理で使用されるパラメータ値はすべて無視されます。自動UNDO管理で使用するパラメータは以下のとおりです。

パラメータ 説明
UNDO_MANAGEMENT UNDOの管理モードを指定する。デフォルトはMANUALで、手動管理モードになっている。自動管理にする場合はAUTOを指定する
UNDO_TABLESPACE 使用するUNDO表領域を指定する。このパラメータを設定しなかった場合は、Oracle Serverが自動的にUNDO表領域を選択する
UNDO_SUPPERESS_ERRORE 手動モードの操作を行った場合、エラーを抑制する。このパラメータ値をTRUEにすると、手動モードの操作を行った場合にエラーが表示されない
UNDO_RETENTION 読み取り一貫性のために使用されるUNDOデータの保存期間を指定する。値は秒単位で指定する
表5 自動UNDO管理で使用するパラメータ

 また、「ORA-01555 スナップショットが古すぎます」といったエラーは「UNDO_RETENTION」パラメータ値を増やすことで抑制できます。

●UNDO表領域の作成・変更・切り替え・削除

 自動UNDO管理に設定しても、UNDO表領域の作成や削除に関しては、Oracleが自動的に行うことはありません。また、自動UNDO管理でも必要に応じて、UNDO表領域のサイズの変更や切り替えはDBAが手動で行います。

 UNDO表領域は、データベース作成時に一緒に作成することもできますが、データベース作成後でも作成可能です。気を付けなければいけないのは、UNDO表領域を削除する場合です。インスタンスで使用中のUNDO表領域は削除できません。別のUNDO表領域に切り替え、現在のトランザクションが完了してから削除を行います。

●自動UNDO管理に関する動的パフォーマンス・ビュー

 自動UNDO管理に関する情報は以下のデータ・ディクショナリ・ビュー、動的パフォーマンス・ビューから取得できます。特に、UNDO表領域に関するビューから、UNDO表領域の統計情報や、適切なサイズを検討する際に必要な情報を格納しているビューがあります。

ビュー 内容
DBA_ROLLBACK_SEGS データベース内のUNDOセグメントの情報を取得できる
V$ROLLNAME/V$ROLLSTATもしくは
V$ROLLNAME/
V$ROLLSTAT
UNDOセグメントの名前と現在の使用統計情報を取得できる。これらのビューは結合して情報を取得する
V$UNDOSTAT 10分間隔で、使用されたUNDOブロックの数や最大問い合わせ時間などの情報を取得できる。また、このビューからの統計情報を使用してUNDO表領域のサイズを見積もることが可能
V$SESSION / V$TRANSACTION トランザクションが使用しているUNDOセグメント、使用ブロック数の情報、セッション情報を取得できる。これらのビューは結合して情報を取得する
表6 UNDO表領域の統計情報や、適切なサイズを検討する際に必要な情報を格納しているビュー

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。