データ格納の為の記憶域の利用②

データベースOracle

記事内に広告が含まれています。

セグメントの管理

表や索引などのデータを保持するオブジェクトは、セグメントという記憶域が「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章

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ