ヘッダーをスキップ

Oracle Database 概要
11gリリース1(11.1)

E05765-03
目次
目次
索引
索引

戻る 次へ

2 データ・ブロック、エクステントおよびセグメント

この章では、Oracleデータベース・サーバーの論理的な記憶域構造の性質と、それらの構造の相互関係について説明します。

この章の内容は、次のとおりです。

データ・ブロック、エクステントおよびセグメントの概要

Oracle Databaseでは、データベース内のすべてのデータに対して論理データベース領域が割り当てられます。データベース領域の割当て単位は、データ・ブロック、エクステントおよびセグメントです。図2-1は、これらのデータ構造間の関係を示します。

図2-1    セグメント、エクステントおよびデータ・ブロックの関係


画像の説明

最少レベルでは、Oracle Databaseはデータをデータ・ブロック論理ブロックOracleブロックまたはページとも呼ばれます)に格納します。1つのデータ・ブロックは、ディスク上の特定のバイト数の物理データベース領域に対応します。

次の論理データベース領域のレベルは、エクステントと呼ばれます。エクステントは、特定数の連続したデータ・ブロックで、特定のタイプの情報を格納するために割り当てられています。

エクステントより大きい論理データベース記憶域のレベルは、セグメントと呼ばれます。セグメントは、それぞれ特定のデータ構造体に割り当てられ、それら全体が同じ表領域に格納されている、エクステントの集合です。たとえば、各表のデータはそれぞれ専用のデータ・セグメントに格納され、各索引のデータはそれぞれ専用の索引セグメントに格納されます。表や索引がパーティション化されている場合、各パーティションはそれぞれ専用のセグメント内に格納されます。

Oracle Databaseでは、セグメントの領域は1エクステント単位で割り当てられます。あるセグメントの既存のエクステントがいっぱいになると、Oracle Databaseでは、そのセグメントには別のエクステントが割り当てられます。エクステントは必要に応じて割り当てられるため、1つのセグメントの各エクステントはディスク上で連続している場合と連続していない場合があります。

1つのセグメントとそのすべてのエクステントは、1つの表領域内に格納されます。表領域内のセグメントは、複数のファイルからのエクステントを含むことがあります。つまり、セグメントは複数のデータファイルにまたがることがあります。ただし、各エクステントが含むことのできるデータは、1つのデータファイルからのデータのみです。

追加のエクステントを割り当てることはできますが、各ブロックは別々に割り当てられます。あるエクステントを特定のインスタンスに割り当てる場合、そのブロックは、即座に空きリストに割り当てられます。しかし、そのエクステントが特定のインスタンスに割り当てられない場合、そのブロックは最高水位標が移動するときのみ割り当てられます。最高水位標は、セグメント内の使用済領域と未使用領域間の境界です。


注意

空き領域を自動的に管理することをお薦めします。「空き領域管理」を参照してください。 


データ・ブロックの概要

Oracle Databaseでは、データベースのデータファイル内の記憶域は、データ・ブロックと呼ばれる単位で管理されます。データ・ブロックは、データベースで使用されるデータの最小単位です。これとは対照的に、物理的なオペレーティング・システム・レベルでは、すべてのデータはバイト単位で格納されます。オペレーティング・システムにはそれぞれブロック・サイズがあります。Oracle Databaseでは、データはオペレーティング・システム・ブロックではなく、Oracle Databaseデータ・ブロックの倍数を単位とする必要があります。

標準のブロック・サイズは、DB_BLOCK_SIZE初期化パラメータで指定します。また、非標準のブロック・サイズを5つまで指定できます。このデータ・ブロック・サイズは、不必要なI/Oを避けるための最大値の範囲内で、オペレーティング・システムのブロック・サイズの倍数です。Oracle Databaseデータ・ブロックは、Oracle Databaseが使用および割当て可能な最小の格納単位です。

この項の内容は、次のとおりです。

データ・ブロックの形式

Oracle Databaseデータ・ブロックの形式は、データ・ブロックに表、索引またはクラスタ化されたデータのどれが含まれるかにかかわらず類似しています。図2-2は、データ・ブロックの形式を示しています。

図2-2    データ・ブロックの形式


画像の説明

この項では、データ・ブロックの次のコンポーネントについて説明します。

ヘッダー(共通と可変)

ヘッダーには、ブロック・アドレスやセグメントのタイプ(たとえば、データまたは索引)などの、一般的なブロック情報が収録されます。

表ディレクトリ

データ・ブロックのこの部分には、このブロックに行を持つ表についての情報が格納されます。

行ディレクトリ

データ・ブロックのこの部分には、ブロック内の実際の行に関する情報(行データ領域内での各行断片のアドレスを含む)が収録されます。

データ・ブロックのオーバーヘッドの行ディレクトリに領域が割り当てられると、その後は行が削除されてもこの領域は再利用されません。したがって、現在は空き状態でも、ある時点では最大50行が入っていたブロックでは、ヘッダー内の行ディレクトリに100バイトが割り当てられたままになっています。Oracle Databaseでは、この領域は、新しい行がブロックに挿入されるときにかぎり再利用されます。

オーバーヘッド

データ・ブロック・ヘッダー、表ディレクトリおよび行ディレクトリのことを、まとめてオーバーヘッドと呼びます。一部のブロック・オーバーヘッドはサイズが固定ですが、ブロック・オーバーヘッド全体のサイズは可変です。データ・ブロック・オーバーヘッドの固定部と可変部の合計は、平均で84〜107バイトになります。

行データ

データ・ブロックのこの部分には、表データまたは索引データが格納されます。行は、複数のブロックにまたがることがあります。

関連項目

「行連鎖と移行」 

空き領域

空き領域は、新しい行の挿入や、追加の領域を必要とする行の更新(後続NULLがNULL以外の値に更新される場合など)に割り当てられます。

表やクラスタのデータ・セグメント、または索引の索引セグメントに割り当てられたデータ・ブロックでは、空き領域にトランザクション・エントリを格納することもできます。トランザクション・エントリは、ブロック内の1つ以上の行にアクセスするINSERTUPDATEDELETEおよびSELECT...FOR UPDATEの文ごとに、ブロック内で必要です。トランザクション・エントリに必要な領域は、オペレーティング・システムによって異なります。ただし、多くのオペレーティング・システムでは、トランザクション・エントリのために約23バイトが必要です。

空き領域管理

空き領域は、自動または手動で管理できます。

空き領域は、データベース・セグメント内で自動的に管理できます。セグメント内の空き領域と使用済領域は、空きリストと対照的に、ビットマップを使用して追跡されます。自動セグメント領域管理には、次の利点があります。

ローカル管理表領域を作成するときに、自動セグメント領域管理を指定します。この指定は、この表領域でそれ以降作成されたすべてのセグメントに適用されます。

関連項目

『Oracle Database管理者ガイド』  

この項の内容は、次のとおりです。

データ・ブロック内の空き領域の可用性と最適化

2種類の文、つまり、DELETE文とUPDATE文によって、1つ以上のデータ・ブロックの空き領域を増加できます。UPDATE文は、既存の値をより小さな値に更新します。これらの文を使用すると、解放された領域は次の条件を満たす後続のINSERT文で使用できます。

解放された領域は、データ・ブロック内の空き領域の主な領域と連続しているとはかぎりません。Oracle Databaseでは、データ・ブロックの空き領域が連続した領域にまとめられるのは、(1)INSERT文またはUPDATE文が使用するブロックに新しい行断片が十分に収まる大きさの空き領域があり、かつ、(2)その空き領域が断片化しているために、行断片をブロックの連続した部分に挿入できない場合にかぎられます。前述の場合に圧縮が行われないと、Oracle Databaseはデータ・ブロックの空き領域を絶えず圧縮しようとするため、データベース・システムのパフォーマンスが低下します。

行連鎖と移行

表の行データが1つのデータ・ブロック内に収まらない状況が2つあります。1番目の状況は、行を最初に挿入するときに、その行が大きすぎて1つのデータ・ブロック内に収まらない場合です。このような場合、Oracle Databaseはその行のデータを、そのセグメント用に確保されたデータ・ブロックの連鎖(1つ以上)に格納します。行連鎖は、データ型LONGまたはLONG RAWの列が入っている行など、大きな行で最も頻繁に発生します。そのような場合の行連鎖は、避けられません。

それに対して、2番目の状況は、1つのデータ・ブロック内にすでに収まっていた行が更新されて、行全体の長さが増加したが、ブロックの空き領域がすでにいっぱいになっている場合です。この場合、Oracle Databaseはその行全体のデータを新しいデータ・ブロックに移行します(その行全体が新しいブロックに収まる場合)。Oracle Databaseにより、移行された行の元の行断片は、行の移行先の新しいブロックを指すように保たれます。そのため、移動された行のROWIDは変わりません。

行が連鎖または移行されると、その行に関連するI/Oパフォーマンスは低下します。これは、その行の情報を取り出す際に、Oracle Databaseが複数のデータ・ブロックをスキャンする必要があるためです。

関連項目

  • 行および行断片の形式の詳細は、「行の形式とサイズ」を参照してください。

  • ROWIDの詳細は、「行断片のROWID」を参照してください。

  • ROWIDの詳細は、「物理ROWID」を参照してください。

  • 行の連鎖と移行を減らしてI/Oパフォーマンスを改善する方法は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

 

PCTFREE、PCTUSEDと行連鎖

手動管理の表領域の場合、PCTFREEおよびPCTUSEDという2つの領域管理パラメータで、空き領域の使用を制御し、特定セグメントのすべてのデータ・ブロック内に行の挿入および更新を実行できます。これらのパラメータは、表またはクラスタ(専用のデータ・セグメントを持つ)を作成または変更するときに指定します。記憶域パラメータPCTFREEは、索引(専用の索引セグメントを持つ)を作成または変更するときにも指定できます。

この項の内容は、次のとおりです。

PCTFREEパラメータ

PCTFREEパラメータは、ブロック内の既存の行を更新する場合に備えてデータ・ブロック内で空き領域として確保される割合の最小値を設定します。たとえば、CREATE TABLE文で次のようにパラメータを指定するとします。

PCTFREE 20 

これによって、この表のデータ・セグメント内の各データ・ブロックの20%が空き状態で維持されます。この空き領域は、各ブロック内の既存の行が更新される場合に使用されます。行データとオーバーヘッドの合計が合計ブロック・サイズの80%になるまで、新規の行を行データ領域に追加し、それに対応する情報をオーバーヘッド領域の可変部分に追加できます。図2-3は、PCTFREEを示しています。

図2-3    PCTFREE


画像の説明

PCTUSEDパラメータ

PCTUSEDパラメータは、新しい行をブロックに追加するときに、行データとオーバーヘッドに使用できるブロックの割合の最小値を設定します。データ・ブロックがPCTFREEで指定した限界値まで満たされると、そのブロックにおける割合がパラメータPCTUSEDの値を下回るまで、Oracle Databaseはそのブロックを新しい行の挿入には使用できないものとみなします。このPCTUSEDの値に到達するまでは、データ・ブロックの空き領域は、Oracle Databaseによりすでにデータ・ブロックに入っている行の更新にのみ使用されます。たとえば、CREATE TABLE文で次のようにパラメータを指定するとします。

PCTUSED 40 

この場合、この表のデータ・セグメントとして使用されるデータ・ブロックは、ブロックの使用領域の総量が39%以下になるまでは、新しい行の挿入に使用できないものとみなされます(ブロックの使用領域がそれ以前にPCTFREEに達していたと仮定します)。図2-4は、このことを示しています。

図2-4    PCTUSED


画像の説明

PCTFREEとPCTUSEDの機能

PCTFREEPCTUSEDの連動により、データ・セグメント内にあるエクステントのデータ・ブロック内の領域の使用が最適化されます。図2-5は、この2つのパラメータの相互作用を示しています。

図2-5    PCTFREEとPCTUSEDによるデータ・ブロックの空き領域の管理


画像の説明

新しく割り当てられたデータ・ブロックでは、挿入に使用できる領域は、ブロック・サイズからブロック・オーバーヘッドと空き領域(PCTFREE)の合計を引いた大きさです。既存データの更新は、ブロック内の使用可能な領域をどれでも使用できます。このため、更新によりブロックの使用可能な領域は、更新用に確保されている領域のPCTFREEより少なくできますが、挿入には使用できません。

各データ・セグメントと索引セグメントについて、Oracle Databaseは1つ以上の空きリストを維持します。空きリストとは、セグメントのエクステントに割り当てられているデータ・ブロックで、PCTFREEよりも大きな空き領域があるブロックのリストのことです。これらのブロックは挿入に使用できます。INSERT文を発行すると、Oracle Databaseにより表の空きリスト内で最初に使用可能なデータ・ブロックがチェックされ、可能であれば使用されます。そのブロックの空き領域が足りないためにINSERT文に対応できない場合、そのブロックがPCTUSED以上であれば、Oracle Databaseにより空きリストから外されます。1つのセグメントに複数の空きリストがあれば、複数の挿入が同時に行われるときに、空きリストの競合を軽減できます。

DELETE文またはUPDATE文が発行されると、Oracle Databaseはその文を処理して、ブロック内の使用中の領域がPCTUSEDよりも小さくなったかどうかを調べます。小さい場合、そのブロックはトランザクション空きリストの先頭に登録され、そのトランザクションで最初に使用される使用可能ブロックになります。トランザクションがコミットされると、ブロック内の空き領域は他のトランザクションで使用可能になります。

エクステントの概要

エクステントは、複数の連続したデータ・ブロックで構成される、データベース記憶域の割当ての論理単位です。1つまたは複数のエクステントによって、セグメントが構成されます。セグメント内の既存の領域を使用し尽くすと、Oracle Databaseはそのセグメントに新しいエクステントを割り当てます。

この項の内容は、次のとおりです。

エクステントの割当て

表を作成する場合、Oracle Databaseはその表のデータ・セグメントに、指定された数のデータ・ブロックからなる初期エクステントを割り当てます。行はまだ挿入されていませんが、初期エクステントに対応するOracle Databaseデータ・ブロックは、その表の行のために確保されています。

セグメントの初期エクステントのデータ・ブロックがいっぱいになり、新しいデータを保持するためさらに多くの領域が必要な場合、Oracle Databaseはそのセグメントに増分エクステントを自動的に割り当てます。増分エクステントは、それより前にそのセグメントに割り当てられていたエクステントのサイズと同一またはそれ以上の後続エクステントです。

メンテナンスに役立つように、各セグメントのヘッダー・ブロックには、そのセグメント内のエクステントのディレクトリが含まれています。


注意

この章は、1つのサーバー・プロセスによってSQL文を解析して実行する、シリアル操作に適用されます。複数のサーバー・プロセスを必要とするパラレルSQL文では、エクステントは少し異なる方法で割り当てられます。 


エクステントの数とサイズの決定

エクステントで指定される記憶域パラメータによって、すべてのセグメントが定義されます。記憶域パラメータは、すべてのタイプのセグメントに適用されます。記憶域パラメータにより、Oracle Databaseで特定のセグメントに空きデータベース領域がどのように割り当てられるかが制御されます。たとえば、CREATE TABLE文のSTORAGE句で記憶域パラメータを指定すると、表のデータ・セグメント用に最初に確保される領域の大きさを決定したり、表で割当て可能なエクステントの数を制限できます。表の記憶域パラメータを指定しない場合は、表領域のデフォルト記憶域パラメータが使用されます。

ディレクトリ管理表領域またはローカル管理表領域を使用できます。前者ではデータ・ディクショナリ表に依存して領域の使用率が追跡され、後者ではビットマップを(データ・ディクショナリ表のかわりに)使用して使用済領域と空き領域が追跡されます。ローカル管理表領域の方がパフォーマンスと管理性に優れているため、エクステント管理のタイプを明示的に指定しないかぎり、SYSTEM以外の永続表領域のデフォルトはローカル管理となります。

エクステントをローカルに管理する表領域の場合は、均一のエクステント・サイズでも、システムによって自動的に決定される可変エクステント・サイズでもかまいません。表領域の作成時に、UNIFORMまたはAUTOALLOCATE(システム管理)句で割当てのタイプを指定します。

ローカル管理表領域の場合、表領域レベルでは記憶域パラメータINITIALNEXTPCTINCREASEおよびMINEXTENTSを指定できません。ただし、セグメント・レベルでは指定できます。この場合は、INITIALNEXTPCTINCREASEおよびMINEXTENTSも併用してセグメントの初期サイズが計算されます。セグメント・サイズの計算後は、内部のアルゴリズムにより各エクステントのサイズが決定されます。

関連項目

 

エクステントの割当て方法

Oracle Databaseがエクステントを割り当てるときには、ローカルに管理されるかディクショナリによって管理されるかに応じて、異なるアルゴリズムが使用されます。

ローカル管理表領域では、Oracle Databaseは最初に表領域内で候補となるデータファイルを判別します。次に、そのデータファイルのビットマップ内で必要数の隣接する空きブロックを検索し、空き領域を検索し、新しいエクステントにこの空き領域を割り当てます。そのデータファイルに十分な隣接する空き領域がない場合は、Oracle Databaseは他のデータファイルを調べます。


注意

ローカル管理表領域を使用することをお薦めします。 


エクステントの割当て解除

Oracle Databaseが提供するセグメント・アドバイザは、オブジェクト内での領域の断片化のレベルに応じて、オブジェクトに再利用可能な領域があるかどうかを判断するのに役立ちます。

関連項目

  • セグメント領域の再利用のガイドラインは、『Oracle Database管理者ガイド』を参照してください。

  • SQL構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照してください。

 

一般に、セグメントにデータが格納されているスキーマ・オブジェクトを(DROP TABLE文またはDROP CLUSTER文によって)削除するまで、そのセグメントのエクステントは表領域に戻されません。ただし、これには次のような例外があります。

エクステントが解放されると、Oracle Databaseはデータファイル内のビットマップを変更するか(ローカル管理表領域の場合)、データ・ディクショナリを更新して(ディクショナリ管理表領域の場合)、再度取得されたエクステントを使用可能領域として反映させます。解放されたエクステントのブロックにあるデータにはアクセスできなくなります。

この項の内容は、次のとおりです。

クラスタ化されていない表のエクステント

クラスタ化されていない表が存在するかぎり、その表を切り捨てるまで、そのデータ・セグメントに割り当てられたデータ・ブロックは割当て解除されません。十分な領域がある場合、Oracle Databaseはブロックに新しい行を挿入します。表の行をすべて削除しても、Oracle Databaseによりデータ・ブロックが再生されて表領域内の他のオブジェクトがそれを使用できるようになることはありません。

クラスタ化されていない表を削除した後、他のエクステントが空き領域を必要とするときに、この領域を再生できます。それらの表が存在していた表領域のデータ・セグメントおよび索引セグメントのすべてのエクステントがOracle Databaseにより再生され、その表領域内の他のオブジェクトが使用できるようになります。

ディクショナリ管理表領域の場合は、使用可能エクステントより大きいエクステントがセグメントに必要になると、Oracle Databaseは再生済の連続したエクステントを識別し、それらを結合して大きいエクステントにします。これを、エクステントの結合と呼びます。ローカル管理表領域の場合は、新しいエクステントが1つ以上のエクステントから再生されたかどうかに関係なく、すべての連続した空き領域が新しいエクステントへの割当てに使用可能なため、エクステントを結合する必要はありません。

クラスタ化表のエクステント

クラスタ化表では、クラスタ用に作成されたデータ・セグメントに情報が格納されます。したがって、クラスタ内の1つの表を削除した場合、データ・セグメントはクラスタ内の他の表が使用できるように残ります。エクステントが割当て解除されることはありません。また、エクステントを解放するために、クラスタ(ハッシュ・クラスタを除く)を切り捨てることもできます。

マテリアライズド・ビューとそのログのエクステント

Oracle Databaseは、マテリアライズド・ビューとマテリアライズド・ビュー・ログのエクステントを、表やクラスタの場合と同じ方法で割当て解除します。

関連項目

「マテリアライズド・ビューの概要」 

索引内のエクステント

索引セグメントに割り当てられたエクステントはすべて、その索引が存在するかぎり、割り当てられたままになります。索引や、それに対応する表またはクラスタを削除すると、Oracle Databaseによりエクステントが再生され、表領域内で他の目的に使用できるようになります。

一時セグメント内のエクステント

Oracle Databaseにより一時セグメントを必要とする文の実行が完了すると、Oracle Databaseによって一時セグメントが自動的に削除され、そのセグメントに割り当てられていたエクステントは、対応する表領域に戻されます。単一のソートでは、その文を発行したユーザーの一時表領域に専用の一時セグメントが作成されます。その後、そのエクステントは表領域に戻されます。

それに対して複数のソートでは、ソート専用に設定されている一時表領域のソート・セグメントを使用できます。これらのソート・セグメントは、インスタンスごとに1回のみ割り当てられ、ソート後には戻されずに残るため、他の複数ソートでそのセグメントを使用できます。

一時表の一時セグメントには、1つのトランザクションまたはセッションの複数の文に関するデータが入っています。Oracle Databaseは、トランザクションまたはセッションの終了時に一時セグメントを削除します。そのセグメントに割り当てられていたエクステントは、対応する表領域に戻されます。

関連項目

 

ロールバック・セグメント内のエクステント

Oracle Databaseでは、データベースのロールバック・セグメントを定期的にチェックし、最適サイズを超えていないかどうか確認されます。ロールバック・セグメントが最適サイズを超えている(つまり、エクステントが多すぎる)場合、ロールバック・セグメントから1つ以上のエクステントがOracle Databaseにより自動的に割当て解除されます。

セグメントの概要

セグメントは、表領域内の特定の論理記憶域構造のデータがすべて入っている、エクステントの集合です。たとえば、各表には、Oracle Databaseによりその表のデータ・セグメントを形成する1つ以上のエクステントが割り当てられ、各索引には、Oracle Databaseにより、その索引セグメントを形成する1つ以上のエクステントが割り当てられます。

この項の内容は、次のとおりです。

データ・セグメントの概要

Oracle Database内の1つのデータ・セグメントには、次のいずれかのデータがすべて保持されます。

このデータ・セグメントは、CREATE文を使用して表またはクラスタを作成する時点でOracle Databaseにより作成されます。

データ・セグメントのエクステントがどのように割り当てられるかは、表またはクラスタの記憶域パラメータによって決定されます。これらの記憶域パラメータは、適切なCREATEまたはALTER文によって直接設定できます。これらの記憶域パラメータは、オブジェクトに対応するデータ・セグメントのデータ検索と格納の効率に影響を与えます。


注意

Oracle Databaseは、マテリアライズド・ビューとマテリアライズド・ビュー・ログのセグメントを、表やクラスタの場合と同じ方法で作成します。  


関連項目

  • マテリアライズド・ビューとマテリアライズド・ビュー・ログの詳細は、『Oracle Databaseアドバンスト・レプリケーション』を参照してください。

  • 構文は、『Oracle Database SQL言語リファレンス』を参照してください。

 

索引セグメントの概要

Oracleデータベース内の各非パーティション索引には、すべてのデータを保持する索引セグメントが1つあります。パーティション索引の場合は、パーティションごとに、そのデータを保持する索引セグメントが1つずつあります。

索引または索引パーティションの索引セグメントは、CREATE INDEX文を発行した時点でOracle Databaseにより作成されます。この文では、索引セグメントのエクステントの記憶域パラメータと、索引セグメントが作成される表領域を指定できます。(表のセグメントと、その表に関連する索引のセグメントは、同一の表領域に存在しなくてもかまいません。)記憶域パラメータを設定すると、データ検索と格納の効率に直接影響があります。

一時セグメントの概要

Oracle Databaseでは、問合せの処理中に、SQL文の解析と実行の中間段階で、一時的な作業領域が必要になることがよくあります。Oracle Databaseは、一時セグメントと呼ばれるこのディスク領域を自動的に割り当てます。通常、Oracle Databaseでは一時セグメントは、ソート操作のデータベース領域として必要です。ソート操作がメモリー内で実行できる場合、またはOracle Databaseが索引を使用して操作を実行できる別の方法を見つけた場合、Oracle Databaseでは一時セグメントは作成されません。

この項の内容は、次のとおりです。

一時セグメントを必要とする操作

次の文では、一時セグメントの使用が必要になる場合があります。

一部の索引付けされていない結合および相関副問合せでも、一時セグメントの使用が必要になることがあります。たとえば、問合せにDISTINCT句、GROUP BYおよびORDER BYが含まれている場合、Oracle Databaseでは2つの一時セグメントが必要になる可能性があります。

一時表とその索引のセグメント

Oracle Databaseは、一時表と一時表に作成される索引用に一時セグメントを割り当てることがあります。一時表には、トランザクションまたはセッションの期間中にのみ存在するデータが保持されます。

関連項目

「一時表」 

一時セグメントが割り当てられる方法

Oracle Databaseは、問合せと一時表には異なる方法で一時セグメントを割り当てます。

この項の内容は、次のとおりです。

問合せ用の一時セグメントの割当て

一時セグメントは、ユーザー・セッション中に必要に応じて、Oracle Databaseにより文を発行したユーザーの一時表領域の1つに割り当てられます。これらの一時表領域は、TEMPORARY TABLESPACE句を付けたCREATE USERまたはALTER USER文で指定します。


注意

永続表領域をユーザーの一時表領域として割り当てることはできません。 


ユーザーに定義されている一時表領域がない場合、SYSTEM表領域がデフォルトの一時表領域として使用されます。一時セグメントのエクステントの記憶特性は、一時セグメントが作成された表領域のデフォルト値によって決まります。一時セグメントは、その文が完了するとOracle Databaseにより削除されます。

一時セグメントの割当てと割当て解除は頻繁に発生するため、一時セグメント専用に1つ以上の表領域を作成してください。これによって、ディスク・デバイス間でI/Oを分散させるとともに、SYSTEM表領域やその他の表領域に一時セグメントが保持されることによって生じるそれらの表領域の断片化を避けることもできます。


注意

SYSTEM表領域がローカル管理の場合は、データベースの作成時にデフォルトの一時表領域を定義する必要があります。ローカル管理のSYSTEM表領域は、デフォルトの一時記憶域として使用できません。 


REDOログには、ソート操作用の一時セグメントに対する変更のエントリは格納されません。ただし、例外として、一時セグメントに対する領域管理操作のエントリは格納されます。

関連項目

 

一時表および索引用の一時セグメントの割当て

その表への最初のINSERTが発行されるときに、Oracle Databaseにより一時表のセグメントが割り当てられます。(これは、CREATE TABLE AS SELECTによって内部で発行される挿入操作の場合もあります。)一時表に対する最初のINSERT文では、表とその索引にセグメントが割り当てられ、索引のルート・ページが作成され、LOBセグメントが割り当てられます。

一時表のセグメントは、その表を作成したユーザーの一時表領域内で割り当てられます。

トランザクションやセッションの終了時に、Oracle Databaseは、それぞれに固有の一時表のセグメントを削除します。その一時表の使用を他のトランザクションまたはセッションが共有している場合、そのデータを含むセグメントは表に残ります。

関連項目

「一時表」 

UNDOセグメントおよび自動UNDO管理の概要

Oracle Databaseでは、データベースに対して行われた変更を無効にするための情報が維持されます。この情報はトランザクションのアクションのレコードで構成され、総称的にUNDOと呼ばれます。UNDOはUNDO表領域のUNDOセグメントに格納されます。UNDOの情報はOracle Databaseにより次の目的で使用されます。

ROLLBACK文が発行されると、UNDOレコードは、コミットされていないトランザクションによってデータベースに加えられた変更を取り消すために使用されます。データベース・リカバリ中には、UNDOレコードは、REDOログからデータファイルに適用されたコミットされていないすべての変更を取り消すために使用されます。UNDOレコードでは、あるユーザーによるデータの変更中にそのデータにアクセスしているユーザーのために、そのデータの修正前のイメージを維持することで読取り一貫性が実現されています。読取り一貫性の詳細は、「Oracle Databaseデータの同時実行性と整合性の管理方法」を参照してください。

Oracle Databaseでは、UNDO情報および領域の管理用に、自動UNDO管理と呼ばれる完全に自動化されたメカニズムが提供されています。この管理モードでは、すべての現行セッションで、UNDO表領域のUNDOセグメントおよび領域がサーバーにより自動的に管理されます。

自動UNDO管理により、ロールバック・セグメント領域の管理の複雑さが解消されます。また、UNDO情報を必要とする長時間実行される問合せに対応するために、最善の状態で保存されたUNDO情報を提供できるよう、システムによりシステム自体が自動的にチューニングされます。自動UNDO管理は、Oracle Databaseの新しいインストールのデフォルトです。インストール・プロセスにより、UNDO表領域が自動的に作成されます。

Oracle Databaseに用意されているUNDOアドバイザは、UNDO環境の確立に関するアドバイスを提供し、その自動化に役立ちます。

この項の内容は、次のとおりです。

手動UNDO管理

データベース・システムは、手動UNDO管理モードでも実行できます。手動UNDO管理モードでは、UNDO領域はロールバック・セグメントを介して管理され、UNDO表領域は使用されません。

Oracle Databaseの以前のリリースでは、手動UNDO管理モードがデフォルトでした。自動UNDO管理に変更するには、まずUNDO表領域を作成し、初期化パラメータを変更する必要がありました。Oracle Databaseのリリースが9i以降の場合に自動UNDO管理に変更する際には、『Oracle Databaseアップグレード・ガイド』を参照してください。


注意

ロールバック・セグメントの領域管理は複雑です。自動UNDO管理を使用することをお薦めします。  


UNDO割当て

自動UNDO管理モードの場合、システムはUNDOセグメントへのトランザクションの割当てを排他的に制御します。また、UNDOセグメントの領域割当てを制御します。問題のあるトランザクションは、UNDO領域のほとんどを使用してしまうことがあるため、システム全体が機能できなくなります。リソース・マネージャ・ディレクティブのUNDO_POOLは、大きいトランザクションを制御するより明示的な方法です。このディレクティブによって、データベース管理者はユーザーをコンシューマ・グループに分けて、それぞれのグループに最大UNDO領域の上限を割り当てることができます。あるグループが使用するUNDO領域の合計が上限を超えると、そのグループのユーザーは、UNDO領域が他のメンバーのトランザクションの終了によって解放されるまで、いかなる更新も実行できません。

UNDO_POOLのデフォルト値は、UNLIMITEDです。ユーザーはUNDO表領域が保持しているのと同じ大きさのUNDO領域を使用できます。データベース管理者は、UNDO_POOLディレクティブを使用して特定のユーザーを制限できます。

自動UNDO保存

トランザクションのコミット後、ロールバックやトランザクション・リカバリの目的にはUNDOデータは不要になります。ただし、一貫性読取りの目的では、長時間実行される問合せで、データ・ブロックの古いイメージを生成するためにこの古いUNDO情報が必要になる場合があります。さらに、古いUNDO情報の可用性が、Oracle Flashback機能の成功に関わる場合もあります。これらの理由から、古いUNDO情報をできるだけ長期間保存することをお薦めします。UNDO表領域に新しいトランザクション用の領域がある場合には、古いUNDO情報を保存できます。表領域の使用可能な領域が不足すると、データベースにより、コミットされたトランザクションの古いUNDO情報の上書きが開始されます。

現行のUNDO表領域の最善のUNDO保存を行うため、Oracle Databaseによりシステムが自動的にチューニングされます。データベースにより、使用統計が収集され、これらの統計およびUNDO表領域サイズに基づいてUNDO保存期間がチューニングされます。UNDO表領域が、最大サイズが指定されていない状態でAUTOEXTENDオプションを使用して構成されている場合には、UNDO保存チューニングは多少異なります。この場合には、データベースにより、実行時間が最も長い問合せより少し長くなるように、UNDO保存期間がチューニングされます(領域が許す場合)。

関連項目

UNDO保存の自動チューニングの詳細は、『Oracle Database管理者ガイド』を参照してください。 


戻る 次へ
Oracle
Copyright © 1993, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引