データ格納の為の記憶域の利用②
セグメントの管理
表や索引などのデータを保持するオブジェクトは、セグメントという記憶域が「1対1」で対応します。
例えば、表を作成すると、その表に対応するセグメントが作成されます。
このセグメントは、表の作成時に格納先として指定した表領域内に格納されます。
以下、セグメントを持つオブジェクトと、持たないオブジェクトです。
●セグメントを持つオブジェクト
| オブジェクト | 説明 |
|---|---|
| 表 | 行データを格納するオブジェクト。 |
| 索引 | 表へのアクセスを高速化する為のオブジェクト。 |
| パーティション表 | 大量のデータを扱いやすくする為に、表を複数に分割したオブジェクト。 分割により、1つのオブジェクトに対して複数のセグメントが対応する。 |
| クラスタ | 一緒に参照される複数の表をグループ化したオブジェクト。 |
| UNDOセグメント | 過去データをUNDO表領域に格納するセグメント。 厳密にはオブジェクトではない。 |
| 一時セグメント | 一時的にデータを一時表領域に保管するセグメント。 厳密にはオブジェクトではない。 |
●セグメントを持たないオブジェクト
| オブジェクト | 説明 |
|---|---|
| ビュー | データを持たない仮想的な表。 |
| シノニム | オブジェクトの別名。 |
| シーケンス(順序) | 連番を振り出すオブジェクト。 |
| ストアドプログラム | プログラムに名前を付けてOracleデータベースに保管し、繰り返し実行できるようにしたもの。 パッケージ・プロシージャ・ファンクション・トリガーがある。 |
遅延セグメント作成
DEFFERED_SEGMENT_CREATION初期化パラメータをTRUEに設定すると、セグメントを持つオブジェクトを作成しても、オブジェクトにデータが格納されるまで、セグメントが作成されません。
表を例にすると、表の作成時にはセグメントは作成されず、表に最初の行をINSERTした時点でセグメントが作成されます。これを遅延セグメント作成と呼びます。
●遅延セグメント作成機能の利点
・データが格納されない可能性がある表が大量に存在する場合に、領域消費を大幅に節約できる。
・大量の表の作成が必要なアプリケーションの導入において、導入時間を大幅に短縮できる。
●遅延セグメント作成機能の使用
・DEFFERED_SEGMENT_CREATION初期化パラメータをTRUEに設定してからセグメントを作成する。
・CREATE TABLE文にSEGMENT CREATTION DEFFERED句を指定する。
セグメントの拡張
大量のデータを追加する処理などを実行して、セグメントの空き領域が不足すると、セグメントに自動的にエクステントが追加され、セグメントのサイズを拡張します。
セグメントの縮小
セグメントに格納したデータが削除された場合は、セグメントを縮小できます。
また、セグメントへのデータ格納に関わる内部動作では重要なものとしてHWMがあります。
●HWM(High Water Mark:高水位標)
各セグメントには、「そのセグメントのどこまでデータが格納されたことがあるか」を示すHWMと呼ばれるマークがあります。
HWMによって、HWMよりも後ろのブロックにはデータが存在しないこと、全てのデータはセグメントの先頭ブロックからHWMの間に格納されていることが保証されます。
この為、表フルスキャンの様に全行分のデータを読み出す必要がある場合でも、Oracleはセグメントの先頭ブロックからHWMまでブロックをアクセスすればよく、全てのブロックを読み出す場合と比べて、処理を効率化できます。
ただし、データを大量に削除すると、HWMはdataの格納状態を正しく反映した位置になりません。
データ追加時にHWMは末尾側には自動的に移動しますが、データ削除時に先頭側に自動的に移動しない為です。
また、セグメントの格納効率も悪くなります。

以上、本記事ではOracleデータベースのセグメント管理について、簡単に紹介しました。
参考文献…オラクルマスター教科書 Silver DBA Oracle Database Administration I 第7章







