Management)について取り上げていってみます。▼はじめに本検証では、異なるセグメント領域管理方法でどのように内部動作をしているか確認し、トランザクション環境によってどちらを選択すべきか参考になるように確認&検証を進めたいと思います。▼そもそも、セグメント領域管理とはOracle内部では、セグメントヘッダーにセグメントの使用ブロックの空き状態を管理します。分かりやすく説明すると、セグメントに対して新しい行をINSERTできるブロックはどのブロックか?、管理するという事です。これは、表領域を効率的に再利用する為に制御する仕組みです。▼セグメント領域管理の種類セグメント領域管理方法は、FREELIST管理と自動セグメント領域管理の2種類の管理方法があります。(9iR1以降)▼セグメント領域管理(FREELIST管理、自動セグメント領域管理)の詳細を次にまとめます。1.FREELIST管理10gR1まで、ローカル管理の表領域作成時のデフォルト設定となります。セグメントブロックの空き領域を管理します。エントリーを制御しいます。INSERT可能ブロックに行が格納されます。空きブロックを検索する為、一度に一つしかブロックアクセスが出来ません。DMLが同時実行された場合、セグメントヘッダの競合が発生します。々もいるのではないでしょうか。呼ばれる領域管理方法です。この機能は、OLTPなどの同時実行SQL(INSERT)のパフォーマンスを向上させるための機能です。10gR2から、ローカル管理の表領域作成時のデフォルト設定となります。Oracle内部で、セグメントが自動的に調整されビットマップでセグメントブロックの空き領域を管理します。従来、セグメント作成時にstorage句で指定可能だったpctused,freelists,freelists_groupsは無効となり、指定したとしても無視されます。領域管理に使用されるビットマップは4ビットで表現されたブロックの状態(下記参照)を保持します。空きが75%以上FREELIST管理と大きく異なるのは、空きブロックを順次検索する必要が無くビットマップの異なる部分を同時に使用できる事です。Bツリー索引に似た構造でLevel分け(3Level)され空きブロックに対し高速にアクセスが可能であることです。従来のFREELIST管理では、大量のINSERT文が同時に実行されるような環境において、空きブロックに同時アクセスが集中しセグメントヘッダーの競合が発生するケースあります。原因の多くはFREELISTの値設定が不適切であることが多いのですが・・・。これらは、自動セグメント領域管理にすることで、軽減できます。有効になりませんでした。MANAGEMENT句に”MANUAL”(FREELIST管理)とオプション指定する必要があります。セグメント領域管理(FREELIST管理、自動セグメント領域管理)の違いを見ていきましょう。MANAGEMENT句でセグメント領域管理方法を指定します。MANUAL;作成表領域の情報DBA_TABLESPACESディクショナリのSEGMENT_SPACE_MANAGEMENT列を確認します。date);▼セグメント領域管理(FREELIST管理、自動セグメント領域管理)の違いまずは、構造の違いから確認します。ディクショナリを見てみると・・・・ITI1スキーマのセグメントは、PCT_USED、FREELISTSに値が入ってないのが分かります。指定してセグメントを作成しても無視されます。1この際、セグメントヘッダーのダンプも取得しておきます。何か”違い”がわかるやもしれません。ダンプを出力するには、セグメントが作成されている表領域のデータファイル番号、ブロック番号が必要でしたね。27;セグメントヘッダーダンプ抜粋(自動セグメント領域管理)なにやら、期待通りの複雑怪奇!?なものが出てきました。25;こちらも期待通りです。▼よって~したがって~・・・明らかに違う!!と思う点を列挙します。1.自動セグメント領域管理では、1種類の高水位標(HWM)を保持している。Level2のビットマップブロック配下には、複数のLevel1のビットマップブロックが作成される階層構造になります。共に同じポインターで管理されています。どのブロックを示しているか分かります。