データ ブロック、エクステント、セグメントの概要
Oracle は、データベース内のすべてのデータに論理データベース領域を割り当てます。データベース領域の割り当ての単位は、データ ブロック、エクステント、およびセグメントです。 図 2-1 は、これらのデータ構造間の関係を示しています。
図 2-1 セグメント、エクステント、データ ブロック間の関係
「図2-1 セグメント、エクステントおよびデータ・ブロック間の関係」の説明
Oracle は、最も細かいレベルの粒度で、データをデータ ブロック (論理ブロック、Oracle ブロック、ページとも呼ばれます) に保存します。1 つのデータ ブロックは、ディスク上の物理データベース領域の特定のバイト数に対応します。
論理データベーススペースの次のレベルはエクステントです。エクステントとは、特定の種類の情報を保存するために割り当てられた、特定の数の連続したデータ ブロックです。
エクステントよりも大きい論理データベース ストレージのレベルはセグメントと呼ばれます。セグメントはエクステントのセットであり、それぞれが特定のデータ構造に割り当てられ、すべてが同じテーブルスペースに格納されます。たとえば、各テーブルのデータは独自のデータ セグメントに格納され、各インデックスのデータは独自のインデックス セグメントに格納されます。テーブルまたはインデックスがパーティション化されている場合、各パーティションは独自のセグメントに格納されます。
Oracle は、セグメントの領域を 1 エクステント単位で割り当てます。セグメントの既存のエクステントがいっぱいになると、Oracle はそのセグメントに別のエクステントを割り当てます。エクステントは必要に応じて割り当てられるため、セグメントのエクステントはディスク上で連続している場合もあれば、連続していない場合もあります。
セグメントとそのすべてのエクステントは 1 つの表領域に格納されます。表領域内のセグメントには、複数のファイルのエクステントを含めることができます。つまり、セグメントはデータファイルにまたがることができます。ただし、各エクステントには 1 つのデータファイルのデータのみを含めることができます。
追加のエクステントを割り当てることもできますが、ブロック自体は個別に割り当てられます。エクステントを特定のインスタンスに割り当てると、ブロックはすぐに空きリストに割り当てられます。ただし、エクステントが特定のインスタンスに割り当てられていない場合、ブロック自体は最高水準点が移動したときにのみ割り当てられます。の ハイ ウォーター マークは、セグメント内の使用済みスペースと未使用スペースの境界です。
ノート:
空き領域を自動的に管理することをお薦めします。「空き領域の管理」を参照してください 。
データブロックの概要
Oracle は、データベースのデータファイル内の記憶領域をデータ ブロックと呼ばれる単位で管理します。データ ブロックは、データベースで使用されるデータの最小単位です。 対照的に、物理的なオペレーティング システム レベルでは、すべてのデータはバイト単位で保存されます。各オペレーティング システムにはブロック サイズがあります。Oracle は、オペレーティング システム ブロックではなく、Oracle データ ブロックの倍数でデータを要求します。
標準ブロック サイズは DB_BLOCK_SIZE
初期化パラメータによって指定されます。さらに、最大 5 つの非標準ブロック サイズを指定できます。不要な I/O を避けるために、データ ブロック サイズは、最大制限内のオペレーティング システムのブロック サイズの倍数である必要があります。Oracle データ ブロックは、Oracle が使用または割り当てできるストレージの最小単位です。
関連項目:
-
データ ブロック サイズの詳細については、Oracle オペレーティング システム固有のドキュメントを参照してください。
データブロックフォーマット
Oracle データ ブロックの形式は、データ ブロックにテーブル データ、インデックス データ、またはクラスター データが含まれるかどうかに関係なく、類似しています。 図 2-2 は、データ ブロックのフォーマットを示しています。
ヘッダー (共通および変数)
ヘッダーには、ブロック アドレスやセグメントのタイプ (データやインデックスなど) などの一般的なブロック情報が含まれています。
テーブルディレクトリ
データ ブロックのこの部分には、このブロック内に行があるテーブルに関する情報が含まれています。
行ディレクトリ
データ ブロックのこの部分には、ブロック内の実際の行に関する情報 (行データ領域内の各行部分のアドレスを含む) が含まれています。
データ ブロックのオーバーヘッドの行ディレクトリにスペースが割り当てられた後は、行が削除されてもこのスペースは再利用されません。したがって、現在は空であるが、一度に最大 50 行を含むブロックには、引き続き行ディレクトリのヘッダーに 100 バイトが割り当てられます。Oracle は、ブロックに新しい行が挿入された場合にのみ、この領域を再利用します。
オーバーヘッド
データ ブロック ヘッダー、テーブル ディレクトリ、および行ディレクトリを総称してオーバーヘッドと呼びます。一部のブロック オーバーヘッドはサイズが固定されています。ブロック オーバーヘッドの合計サイズは可変です。平均すると、データ ブロック オーバーヘッドの固定部分と可変部分の合計は 84 ~ 107 バイトになります。
行データ
データ ブロックのこの部分には、テーブル データまたはインデックス データが含まれます。行はブロックにまたがることができます。
関連項目:
フリースペース
空き領域は、新しい行の挿入と、追加の領域を必要とする行の更新 (たとえば、末尾の null が null 以外の値に更新される場合) に割り当てられます。
テーブルまたはクラスターのデータ セグメント、またはインデックスのインデックス セグメントに割り当てられたデータ ブロックでは、空き領域にトランザクション エントリを保持することもできます。ブロック内の 1 つ以上の行にアクセスする、 INSERT
、 、および ... ステートメントごとに、ブロック内にトランザクション エントリが必要です 。トランザクション エントリに必要なスペースはオペレーティング システムによって異なります。ただし、ほとんどのオペレーティング システムのトランザクション エントリには約 23 バイトが必要です。UPDATE
DELETE
SELECT
FOR
UPDATE
空き領域の管理
空き領域は自動または手動で管理できます。
空き領域はデータベースセグメント内で自動的に管理できます。セグメント内の空き/使用済みスペースは、空きリストではなくビットマップを使用して追跡されます。自動セグメントスペース管理には次の利点があります。
-
使いやすさ
-
特に行サイズが大きく異なるオブジェクトの場合、スペース使用率が向上します。
-
同時アクセスの変動に対する実行時の調整の向上
-
パフォーマンス/スペース使用率の観点からマルチインスタンスの動作が向上
ローカル管理される表領域を作成するときに、自動セグメント領域管理を指定します。この仕様は、その後この表領域に作成されるすべてのセグメントに適用されます。
関連項目:
データ ブロック内の空き領域の可用性と最適化
2あなたについて複数のステートメントを使用すると、1 つ以上のデータ ブロック ( DELETE
ステートメント、および UPDATE
既存の値をより小さい値に更新するステートメント) の空き領域を増やすことができます。INSERT
これらのタイプのステートメントから解放されたスペースは、次の条件の下で後続のステートメントに使用できます 。
-
INSERT
ステートメントが同じトランザクション内にあり、スペースを解放するステートメントの後続である 場合 、そのINSERT
ステートメントは使用可能になったスペースを使用できます。 -
INSERT
ステートメントが、スペースを解放するステートメント (おそらく別のユーザーによって実行されている) とは別のトランザクション内にある場合、その ステートメントINSERT
は、他のトランザクションのコミット後にスペースが必要な場合にのみ、利用可能になったスペースを使用できます。
解放されたスペースは、データ ブロック内の空きスペースのメイン領域と連続している場合もあれば、連続していない場合もあります。Oracle がデータ ブロックの空き領域を結合するのは、(1) or INSERT
ステートメント UPDATE
が新しい行部分を含めるのに十分な空き領域を含むブロックを使用しようとした場合、および (2) 空き領域が断片化されているために行部分を挿入できない場合に限られます。ブロックの連続したセクション内。Oracle がこの圧縮を行うのは、そのような状況の場合のみです。そうしないと、データ ブロック内の空き領域が継続的に圧縮されるため、データベース システムのパフォーマンスが低下します。
行のチェーン化と移行
2 つの状況では、テーブル内の行のデータが大きすぎて 1 つのデータ ブロックに収まらない可能性があります。最初のケースでは、行が最初に挿入されたときに大きすぎて 1 つのデータ ブロックに収まりません。この場合、Oracle は行のデータを、そのセグメント用に予約されたデータ ブロック (1 つ以上) のチェーンに格納します。LONG
行チェーンは、データ型または の列を含む行などの大きな行で最も頻繁に発生します LONG
RAW
。このような場合、行チェーンは避けられません。
ただし、2 番目のケースでは、もともと 1 つのデータ ブロックに収まる行が更新されるため、行全体の長さが増加し、ブロックの空き領域はすでに完全に埋まっています。この場合、Oracle は行全体が新しいブロックに収まると仮定して、行全体のデータを新しいデータ ブロックに移行します。 Oracle は、移行された行を含む新しいブロックを指すように、移行された行の元の行部分を保持します。移行された行の ROWID は変更されません。
行がチェーン化または移行されると、Oracle は行の情報を取得するために複数のデータ ブロックをスキャンする必要があるため、この行に関連する I/O パフォーマンスが低下します。
関連項目:
-
行および行部分の形式の詳細は、「行の形式とサイズ」を参照してください。
-
ROWIDの詳細は、「行ピースのROWID」を参照してください。
-
ROWIDの詳細は、「物理ROWID」を参照してください。
-
チェーン行と移行行の削減およびI/Oパフォーマンスの改善の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。
PCTFREE、PCTUSED、および行チェーン
手動で管理される表領域の場合、 と の 2 つの領域管理パラメータを使用する PCTFREE
と PCTUSED
、特定のセグメントのすべてのデータ ブロック内の行に対する挿入と更新のための空き領域の使用を制御できます。これらのパラメータは、テーブルまたはクラスタ (独自のデータ セグメントを持つ) を作成または変更するときに指定します。PCTFREE
インデックス (独自のインデックス セグメントを持つ) を作成または変更するときに、ストレージ パラメーターを指定することもできます 。
ノート:
この説明は、LOB データ型 ( BLOB
、 CLOB
、 NCLOB
、および BFILE
) には適用されません。PCTFREE
ストレージパラメータやフリーリストは使用しません 。
詳細は、「LOBデータ型の概要」を参照してください 。
PCTFREE パラメータ
この PCTFREE
パラメーターは、そのブロック内に既に存在する行を更新できるように、空き領域として予約されるデータ ブロックの最小パーセンテージを設定します。たとえば、 CREATE
TABLE
ステートメント内で次のパラメータを指定するとします。
PCTフリー20
これは、このテーブルのデータ セグメント内の各データ ブロックの 20% が空き状態に保たれ、各ブロック内の既存の行の更新に使用できることを示しています。行データとオーバーヘッドの合計が合計ブロック サイズの 80% になるまで、新しい行を行データ領域に追加し、対応する情報をオーバーヘッド領域の可変部分に追加できます。 図 2-3に を示します PCTFREE
。
PCTUSED パラメータ
この PCTUSED
パラメーターは、新しい行がブロックに追加される前に、行データとオーバーヘッドに使用できるブロックの最小パーセンテージを設定します。データ・ブロックが によって決定される制限まで満たされると PCTFREE
、Oracle は、そのブロックの割合がパラメータを下回るまで、そのブロックは新しい行を挿入できないとみなします PCTUSED
。この値に達するまで、Oracle はデータ ブロックの空き領域を、データ ブロックに既に含まれている行の更新にのみ使用します。たとえば、 CREATE
TABLE
ステートメントで次のパラメータを指定するとします。
PCTユーズド 40
この場合、このテーブルのデータ セグメントに使用されるデータ ブロックは、ブロック内の使用領域の量が 39% 以下に低下するまで、新しい行を挿入できないとみなされます (ブロックの使用領域が以前に に達していると仮定します) PCTFREE
。 図 2-4 は これを示しています。
PCTFREE と PCTUSED の連携方法
PCTFREE
これら PCTUSED
が連携して、データ セグメント内のエクステントのデータ ブロック内のスペースの使用を最適化します。 図 2-5 は、 これら 2 つのパラメータの相互作用を示しています。
図 2-5 PCTFREE および PCTUSED によるデータ ブロックの空き領域の維持
「図2-5 PCTFREEおよびPCTUSEDを使用したデータ・ブロックの空き領域の維持」の説明
新しく割り当てられたデータ ブロックでは、挿入に使用できるスペースは、ブロック サイズからブロック オーバーヘッドと空きスペースの合計を引いたものになります ( PCTFREE
)。既存のデータの更新では、ブロック内の利用可能なスペースを使用できます。PCTFREE
したがって、更新により、ブロックの利用可能な領域が、更新用に予約されているが挿入にはアクセスできない領域未満に減少する可能性があります 。
データおよび索引セグメントごとに、Oracle は 1 つ以上のフリー・リスト (そのセグメントのエクステントに割り当てられ、 より大きい空き領域を持つデータ・ブロックのリスト) を維持します PCTFREE
。これらのブロックは挿入に使用できます。ステートメントを発行すると INSERT
、Oracle はテーブルの空きリストで最初に使用可能なデータ ブロックを確認し、可能であればそれを使用します。そのブロックの空き領域が文を収容できるほど大きくなく INSERT
、ブロックが少なくとも の PCTUSED
場合、Oracle はそのブロックを空きリストから削除します。各セグメントに複数のフリー リストを使用すると、同時挿入が行われるときにフリー リストの競合を減らすことができます。
DELETE
or ステートメントを発行すると UPDATE
、Oracle はそのステートメントを処理し、ブロック内で使用されている領域が より小さいかどうかを確認します PCTUSED
。存在する場合、そのブロックはトランザクションの空きリストの先頭に移動し、そのトランザクションで使用できる最初のブロックになります。トランザクションがコミットされると、ブロック内の空き領域が他のトランザクションに使用できるようになります。
エクステントの概要
あn エクステントは、多数の連続したデータ ブロックで構成されるデータベース記憶域割り当ての論理単位です。1 つ以上のエクステントがセグメントを構成します。セグメント内の既存の領域が完全に使用されると、Oracle はそのセグメントに新しいエクステントを割り当てます。
エクステントが割り当てられる場合
表を作成すると、Oracle は指定された数のデータ ブロックの初期エクステントを表のデータ セグメントに割り当てます。まだ行は挿入されていませんが、初期エクステントに対応する Oracle データ ブロックがそのテーブルの行用に予約されています。
セグメントの初期エクステントのデータ ブロックがいっぱいになり、新しいデータを保持するためにさらに多くの領域が必要になる場合、Oracle はそのセグメントに増分エクステントを自動的に割り当てます。増分エクステントは、そのセグメント内で以前に割り当てられたエクステントと同じかそれより大きいサイズの後続のエクステントです。
メンテナンスの目的で、各セグメントのヘッダー ブロックには、そのセグメント内のエクステントのディレクトリが含まれています。
ノート:
この章は、1 つのサーバー プロセスが SQL ステートメントを解析して実行するシリアル操作に適用されます。複数のサーバープロセスが必要となる並列 SQL ステートメントでは、エクステントの割り当て方法が若干異なります。
エクステントの数とサイズを決定する
エクステントの観点から表現されるストレージ パラメータは、すべてのセグメントを定義します。ストレージ パラメータは、すべてのタイプのセグメントに適用されます。これらは、Oracle が特定のセグメントに空きデータベース領域を割り当てる方法を制御します。たとえば、テーブルのデータ セグメント用に最初に予約されるスペースの量を決定したり、ステートメントの句でテーブルの記憶域パラメータを指定することによって、テーブルが割り当てることができるエクステントの数を制限したりでき STORAGE
ます CREATE
TABLE
。テーブルの記憶域パラメータを指定しない場合は、テーブルスペースのデフォルトの記憶域パラメータが使用されます。
データ・ディクショナリ表に依存して領域使用率を追跡するディクショナリ管理表領域や、(データ・ディクショナリ表の代わりに)ビットマップを使用して使用領域と空き領域を追跡するローカル管理表領域を使用できます。SYSTEM
ローカルで管理される表領域のパフォーマンスが向上し、管理が容易になるため、エクステント管理のタイプが明示的に指定されていない場合は、非永続表領域のデフォルトはローカルで管理されます。
エクステントをローカルで管理する表領域には、均一のエクステント サイズまたはシステムによって自動的に決定される可変エクステント サイズのいずれかを設定できます。表領域を作成するとき、 UNIFORM
or AUTOALLOCATE
(システム管理) 句で割り当てのタイプを指定します。
-
均一エクステントの場合、エクステント サイズを指定することも、デフォルト サイズ (1 MB) を使用することもできます。データベース ブロック サイズを考慮して、各エクステントに少なくとも 5 つのデータベース ブロックが含まれていることを確認してください。エクステントをローカルで管理する一時表領域は、このタイプの割り当てのみを使用できます。
-
システム管理エクステントの場合、Oracle は追加エクステントの最適なサイズを決定します。最小エクステント サイズは 64 KB です。表領域が「セグメント領域管理自動」で作成され、データベースのブロック サイズが 16K 以上の場合、Oracle は最小サイズ 1M のエクステントを作成することでセグメント サイズを管理します。これは永続テーブルスペースのデフォルトです。
ストレージパラメータ INITIAL
、 NEXT
、 PCTINCREASE
、および は、 MINEXTENTS
ローカルに管理される表領域の表領域レベルでは指定できません。ただし、セグメント レベルで指定することもできます。この場合、 セグメントの初期サイズを計算するために、 INITIAL
、 NEXT
、 PCTINCREASE
、および が 一緒に使用されます。MINEXTENTS
セグメント サイズが計算された後、内部アルゴリズムによって各エクステントのサイズが決定されます。
関連項目:
エクステントの割り当て方法
Oracle は、エクステントがローカルで管理されるかディクショナリで管理されるかに応じて、異なるアルゴリズムを使用してエクステントを割り当てます。
ローカルで管理される表領域の場合、Oracle は、まず表領域内の候補データファイルを決定し、次にデータファイルのビットマップで必要な数の隣接する空きブロックを検索することにより、新しいエクステントに割り当てる空き領域を探します。そのデータファイルに隣接する十分な空き領域がない場合、Oracle は別のデータファイルを検索します。
ノート:
ローカルで管理される表領域を使用することを強くお勧めします。
エクステントの割り当てが解除されるとき
Oracle Databaseには、オブジェクト内の領域断片化のレベルに基づいて、オブジェクトに再利用可能な領域があるかどうかを判断するのに役立つセグメント・アドバイザが提供されています。
関連項目:
-
セグメント領域の再利用に関するガイドラインは、『Oracle Database管理者ガイド』を参照してください。
-
SQL構文とセマンティクスについては、『Oracle Database SQLリファレンス』を参照してください。
一般に、セグメントのエクステントは、データがセグメントに格納されているスキーマ オブジェクトを (or DROP
TABLE
ステートメント を使用してDROP
CLUSTER
) 削除するまで、表領域に戻りません。これに対する例外には次のようなものがあります。
-
テーブルまたはクラスターの所有者、または権限を持つユーザーは 、 ...ステートメント
DELETE
ANY
を使用してテーブルまたはクラスターを切り詰めることができます 。TRUNCATE
DROP
STORAGE
-
データベース管理者 (DBA) は、次の SQL 構文を使用して、未使用のエクステントの割り当てを解除できます。
ALTER TABLE table_name DEALLOCATE 未使用;
-
Oracle は、ロールバック セグメントのサイズが
OPTIMAL
指定されている場合、定期的にそのロールバック セグメントの 1 つ以上のエクステントの割り当てを解除します。
エクステントが解放されると、Oracle はデータファイル内のビットマップ (ローカル管理表領域の場合) を変更するか、データ・ディクショナリ (ディクショナリ管理表領域の場合) を更新して、回復されたエクステントを使用可能な領域として反映します。解放されたエクステントのブロック内のデータにはアクセスできなくなります。
関連項目:
非クラスター化テーブルのエクステント
非クラスター化テーブルが存在する限り、またはテーブルを切り詰めるまで、そのデータ セグメントに割り当てられたデータ ブロックはテーブルに割り当てられたままになります。十分なスペースがある場合、Oracle はブロックに新しい行を挿入します。表のすべての行を削除した場合でも、Oracle は表領域内の他のオブジェクトが使用できるようにデータ ブロックを再利用しません。
非クラスター化テーブルを削除した後、他のエクステントが空き領域を必要とするときに、この領域を再利用できます。Oracle は、テーブルのデータおよびインデックス セグメントが存在していたテーブルスペースのすべてのエクステントを再利用し、そのエクステントを同じテーブルスペース内の他のスキーマ オブジェクトで使用できるようにします。
ディクショナリ管理表領域では、セグメントが使用可能なエクステントよりも大きいエクステントを必要とする場合、Oracle は連続した再利用エクステントを識別して結合して、より大きなエクステントを形成します。これは結合エクステントと呼ばれます。ローカル管理の表領域では、エクステントを結合する必要はありません。これは、1 つ以上のエクステントから再利用されたかどうかに関係なく、すべての連続した空き領域を新しいエクステントに割り当てることができるためです。
クラスター化テーブルのエクステント
クラスター化テーブルには、クラスター用に作成されたデータ セグメントに情報が格納されます。したがって、クラスター内の 1 つのテーブルを削除した場合、データ セグメントはクラスター内の他のテーブルに残り、エクステントの割り当ては解除されません。クラスター (ハッシュ クラスターを除く) を切り詰めてエクステントを解放することもできます。
マテリアライズド ビューのエクステントとそのログ
Oracle は、テーブルやクラスタの場合と同じ方法で、マテリアライズド ビューとマテリアライズド ビュー ログのエクステントの割り当てを解除します。
関連項目:
インデックス内のエクステント
インデックス セグメントに割り当てられたすべてのエクステントは、インデックスが存在する限り割り当てられたままになります。インデックスまたは関連するテーブルまたはクラスタを削除すると、Oracle はテーブルスペース内の他の用途のためにエクステントを再利用します。
一時セグメントのエクステント
だれn Oracle が一時セグメントを必要とする文の実行を完了すると、Oracle は一時セグメントを自動的に削除し、そのセグメントに割り当てられたエクステントを関連する表領域に返します。単一のソートは、ステートメントを発行したユーザーの一時表領域に独自の一時セグメントを割り当て、エクステントを表領域に返します。
ただし、複数のソートでは、ソート専用に指定された一時表領域内のソート・セグメントを使用できます。これらの並べ替えセグメントはインスタンスに 1 回だけ割り当てられ、並べ替え後に返されませんが、他の複数の並べ替えでは引き続き使用できます。
一時テーブルの一時セグメントには、単一のトランザクションまたはセッションの複数のステートメントのデータが含まれます。Oracle はトランザクションまたはセッションの終了時に一時セグメントを削除し、そのセグメントに割り当てられたエクステントを関連する表領域に返します。
関連項目:
ロールバックセグメントのエクステント
Oracle はデータベースのロールバック セグメントを定期的にチェックして、最適なサイズよりも大きくなっていないかどうかを確認します。ロールバック セグメントが最適なサイズより大きい場合 (つまり、エクステントが多すぎる場合)、Oracle はロールバック セグメントから 1 つ以上のエクステントの割り当てを自動的に解除します。
セグメントの概要
あ セグメントは、表領域内の特定の論理ストレージ構造のすべてのデータを含むエクステントのセットです。たとえば、Oracle はテーブルごとに 1 つ以上のエクステントを割り当ててそのテーブルのデータ セグメントを形成し、インデックスごとに 1 つ以上のエクステントを割り当ててインデックス セグメントを形成します。
このセクションには次のトピックが含まれています。
データセグメントの概要
Oracle データベース内の単一のデータ セグメントには、次のいずれかのデータがすべて保持されます。
いいえcle は、ステートメントでテーブルまたはクラスターを作成するときに、このデータ セグメントを作成します CREATE
。
テーブルまたはクラスターのストレージ パラメーターによって、そのデータ セグメントのエクステントがどのように割り当てられるかが決まります。CREATE
これらのストレージ パラメータは、適切なor ステートメントを使用して直接設定できます ALTER
。これらのストレージ パラメータは、オブジェクトに関連付けられたデータ セグメントのデータ取得とストレージの効率に影響します。
ノート:
Oracle は、表やクラスタの場合と同じ方法で、マテリアライズド ビューとマテリアライズド ビュー ログのセグメントを作成します。
関連項目:
-
マテリアライズド・ビューおよびマテリアライズド・ビュー・ログの詳細は、『Oracle Databaseアドバンスト・レプリケーション』を参照してください。
インデックスセグメントの概要
Oracle データベース内のすべての非パーティション索引には、すべてのデータを保持する単一の索引セグメントがあります。パーティションインデックスの場合、各パーティションにはデータを保持する単一のインデックスセグメントがあります。
文を発行すると、Oracle によって索引または索引パーティションの索引セグメントが作成されます CREATE
INDEX
。このステートメントでは、インデックス セグメントのエクステントとインデックス セグメントを作成する表領域の記憶域パラメータを指定できます。(テーブルのセグメントとそれに関連付けられたインデックスは、同じテーブルスペースを占有する必要はありません。) ストレージパラメータの設定は、データの取得とストレージの効率に直接影響します。
一時セグメントの概要
クエリを処理するとき、Oracle は多くの場合、SQL ステートメントの解析と実行の中間段階のために一時的なワークスペースを必要とします。Oracle は、一時セグメントと呼ばれるこのディスク領域を自動的に割り当てます。通常、Oracle ではソート用のデータベース領域として一時セグメントが必要です。ソート操作がメモリー内で実行できる場合、またはOracleが索引を使用して操作を実行する他の方法を見つけた場合、Oracleはセグメントを作成しません。
一時セグメントを必要とする操作
Th次のステートメントでは、一時セグメントの使用が必要になる場合があります。
-
CREATE
INDEX
-
SELECT ... ORDER BY
-
SELECT DISTINCT ...
-
SELECT ... GROUP BY
-
SELECT
。。。UNION
-
SELECT ... INTERSECT
-
SELECT ... MINUS
それでインデックスのない結合と相関サブクエリでは、一時セグメントの使用が必要になる場合があります。たとえば、クエリに DISTINCT
句、 GROUP
BY
および が 含まれる場合ORDER
BY
、Oracle は最大 2 つの一時セグメントを必要とすることがあります。
一時テーブルのセグメントとそのインデックス
Oracle は、一時テーブルおよび一時テーブル上に作成されたインデックスに一時セグメントを割り当てることもできます。一時テーブルには、トランザクションまたはセッションの間のみ存在するデータが保持されます。
関連項目:
一時セグメントの割り当て方法
Oracle は、クエリと一時テーブルに対して異なる方法で一時セグメントを割り当てます。
○racle は使用中に必要に応じて一時セグメントを割り当てますrセッション ステートメントを発行したユーザーの一時表領域の 1 つ。これらの表領域は、 句を 使用した CREATE
USER
または ステートメントで指定します 。ALTER
USER
TEMPORARY
TABLESPACE
ノート:
永続表領域をユーザーの一時表領域として割り当てることはできません。
ユーザーに対して一時表領域が定義されていない場合、デフォルトの一時表領域が表 領域になりますSYSTEM
。含まれている表領域のデフォルトのストレージ特性によって、一時セグメントのエクステントの特性が決まります。Oracle はステートメントが完了すると一時セグメントを削除します。
一時セグメントの割り当てと割り当て解除は頻繁に行われるため、一時セグメント用に少なくとも 1 つの特別な表領域を作成してください。これにより、ディスク デバイス間で I/O を分散でき、 SYSTEM
一時セグメントを保持する テーブルスペースや他のテーブルスペースの断片化を回避できます。
ノート:
表領域がローカルで管理されている場合 SYSTEM
、データベースの作成時にデフォルトの一時表領域を定義する必要があります。ローカルで管理される SYSTEM
テーブルスペースは、デフォルトの一時ストレージとして使用できません。
ソート操作に使用される一時セグメントへの変更エントリは、一時セグメントでのスペース管理操作を除き、REDO ログに保存されません。
関連項目:
-
ユーザーの一時セグメント表領域の割り当ての詳細は、第20章「データベース・セキュリティ」を参照してください。
一時テーブルおよびインデックスの一時セグメントの割り当て
Oracle は、一時テーブルへの最初のセグメントが INSERT
発行されるときに、そのテーブルにセグメントを割り当てます。(これは、 によって発行される内部挿入操作である可能性があります 。) 一時テーブルへの CREATE
TABLE
AS
SELECT
最初の 操作は、テーブルとそのインデックスのセグメントを割り当て、インデックスのルート ページを作成し、 セグメントを割り当てます。INSERT
LOB
一時テーブルのセグメントは、一時テーブルを作成したユーザーの一時テーブルスペースに割り当てられます。
Oracle は、トランザクション固有の一時テーブルのセグメントをトランザクションの終了時に削除し、セッション固有の一時テーブルのセグメントをセッションの終了時に削除します。他のトランザクションまたはセッションがその一時テーブルの使用を共有する場合、それらのデータを含むセグメントはテーブル内に残ります。
関連項目:
の紹介 自動アンドゥ管理
オラクルは、データベースに加えられた変更を無効にするための情報を保持します。このような情報は、まとめて「元に戻す」と呼ばれるトランザクションのアクションの記録で構成されます。Oracle は、UNDO を使用して次のことを実行します。
-
アクティブなトランザクションをロールバックする
-
終了したトランザクションを回復する
-
読み取りの一貫性を提供する
-
論理的な破損からの回復
自動UNDO管理はUNDO表領域に基づいています。さまざまなサイズのロールバック セグメントを多数割り当てるのではなく、UNDO 表領域の形式で領域を割り当てます。
自動 UNDO 管理により、ロールバック セグメント領域の管理の複雑さが解消され、上書きされる前に UNDO が保持される期間を制御できるようになります。UNDOの管理には、ロールバック・セグメントではなくUNDO表領域を使用することを強くお薦めします。UNDO情報を必要とする問合せを満たすために、システムはUNDO表領域にUNDOが保持される期間を自動的に調整します。現在の UNDO 表領域に十分な領域がある場合は、 UNDO_RETENTION
パラメータに低いしきい値を設定して、少なくともパラメータで指定された時間の間はシステムが UNDO を保持するようにすることができます。
この V$UNDOSTAT
ビューを使用してデータベース システムを監視および構成し、UNDO 領域を効率的に使用できるようにします。 V$UNDOSTAT
インスタンス内で消費されたアンドゥ領域の量など、さまざまなアンドゥとトランザクションの統計を示します。
ノート:
Oracle の以前のリリースでは、手動 UNDO 管理モードとも呼ばれるロールバック セグメントを使用して UNDO を保存していました。これらのロールバック セグメントの領域管理は複雑であったため、Oracle は現在、UNDO を保存するこの方法を非推奨にしています。
Oracle データベースには、UNDO 環境の構築に関するアドバイスを提供し、自動化を支援する Undo Advisor が含まれています。
関連項目:
UNDOアドバイザおよびアドバイザの使用方法の詳細は、 『Oracle Database 2日でDBA』を参照してください。 自動UNDO管理の使用の詳細は、『Oracle Database管理者ガイド』を参照してください。
元に戻すモード
Undo モードは、手動 Undo 管理から自動 Undo 管理に移行するためのより柔軟な方法を提供します。データベース システムは、手動 UNDO 管理モードまたは自動 UNDO 管理モードのいずれかで実行できます。手動 UNDO 管理モードでは、UNDO 領域はロールバック セグメントを通じて管理されます。自動UNDO管理モードでは、UNDO領域はUNDO表領域で管理されます。UNDO_MANAGEMENT
自動UNDO管理モードを使用するには、データベース管理者はインスタンスごとにUNDO表領域を作成し、初期化パラメータを に 設定するだけで済みます AUTO
。自動 UNDO 管理モードで実行することを強くお勧めします。
引用を元に戻す
自動 UNDO 管理モードでは、システムは UNDO セグメントへのトランザクションの割り当てを排他的に制御し、UNDO セグメントのスペース割り当てを制御します。不正なトランザクションは、UNDO 領域の大部分を消費し、システム全体を麻痺させる可能性があります。Resource Manager ディレクティブは、 UNDO_POOL
大規模なトランザクションを制御するためのより明示的な方法です。これにより、データベース管理者はユーザーをコンシューマ グループにグループ化し、各グループに最大 UNDO 領域制限を割り当てることができます。グループによって消費される合計 UNDO スペースが制限を超えると、そのユーザーは、他のメンバーのトランザクションが終了して UNDO スペースが解放されるまで、それ以上の更新を行うことができません。
のデフォルト値は UNDO_POOL
です UNLIMITED
。この場合、ユーザーは UNDO 表領域と同じ量の UNDO 領域を消費できます。データベース管理者は、ディレクティブを使用して特定のユーザーを制限できます UNDO_POOL
。
自動取り消し保持
Oracle Database 10g は、UNDO 保持期間と呼ばれるパラメータを自動的に調整します。UNDO 保持期間は、古い UNDO 情報 (コミットされたトランザクションの UNDO 情報) が上書きされるまでの経過時間を示します。データベースは使用状況統計を収集し、これらの統計とUNDO表領域のサイズに基づいてUNDO保持期間を調整します。自動 UNDO 管理が有効になっている場合、データベースは次のように UNDO 保持期間を自動的に調整します。
-
UNDO表領域の場合
AUTOEXTEND
、スペースが許せば、データベースは最も長く実行されるクエリよりもわずかに長くなるようにUNDO保持期間を調整します。さらに、十分な空き領域がある場合、調整された保存期間は初期化パラメーターの値を下回ることはありませんUNDO_RETENTION
。 -
固定サイズのUNDO表領域の場合、データベースは可能な最大のUNDO保持を実現するように調整されます。これは、UNDO 表領域での領域不足状態および領域不足に近い状態を回避しながら、可能な限り最長の保存期間を常に提供することを意味します。保持保証が有効になっていない限り、初期化パラメータ
UNDO_RETENTION
は無視されます。 -
UNDO 保持の自動チューニングは LOB ではサポートされていません。LOB 列の調整された保持値は、パラメーターの値に設定されます
UNDO_RETENTION
。
固定サイズの表領域と AUTOEXTEND
同じサイズの UNDO 表領域の場合、実行するクエリに応じて、固定サイズの表領域で使用されるチューニング方法では、保持期間が長くなる傾向があります。これにより、フラッシュバック操作をより長期間にわたってフラッシュバックできるようになり、長時間実行されるクエリで使用できる UNDO データの量が最大化されます。
外観
V$TRANSACTION
と を使用してトランザクションと元に戻す情報を監視します V$ROLLSTAT
。自動 UNDO 管理の場合、 の情報は V$ROLLSTAT
自動 UNDO 管理の UNDO セグメントの動作を反映しています。
この V$UNDOSTAT
ビューには、システムがどの程度うまく機能しているかを示す統計データのヒストグラムが表示されます。UNDO 消費率、トランザクションの同時実行数、インスタンス内で実行されるクエリの長さなどの統計を確認できます。このビューを使用すると、現在のワークロードに必要な UNDO 領域の量をより正確に見積もることができます。
関連項目:
UNDO_MANAGEMENT
UNDO保持の 設定、自動チューニングおよび使用の詳細は、 『Oracle Database管理者ガイド』を参照してください。V$UNDOSTAT