ORACLE MASTER Silver DBA ポイント解説

Oracleエンジニアを目指す
ORACLE MASTER Silver DBAポイント解説
第5回 記憶領域構造とUNDOデータの管理

小野寺智子
2005/3/30

これまで連載してきた「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 表領域の構成

 前回解説したように、セグメントはいくつかのエクステントが集まって構成されています。つまり、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 データ・ブロックの内容

 データ・ブロックのこれらの領域を制御するには、以下のパラメータを使用します(表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 行移行

図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セグメントの役割

●自動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表領域の統計情報や、適切なサイズを検討する際に必要な情報を格納しているビュー


関連記事
ORACE MASTER Goldポイント解説
ORACLE MASTERはこう変わる!
ORACLE MASTER Silver(@IT自分戦略研究所資格用語辞典)
関連サービス
ITトレメ
ラーニングカレンダー(ORACLE MASTER)
@IT Special 注目企業
@IT Special ラーニング
関連キーワード

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード


スキルアップに役立つサービス
ITトレメ スキルアップに役立つ問題を無料で出題
ラーニングカレンダー ITスキル研修4000件、最新情報の検索できます

キャリアアップ

スポンサーからのお知らせ

・ケ・ュ・チマツ、クヲオ貍シ・ケ・ン・・オ。シ

- PR -
@IT Special 注目企業
インデックス

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報


@IT Special ラーニング