PCTUSEDでデータの挿入を抑える

図7●PCTUSEDパラメータの機能
新たなレコードの挿入を許す,データ・ブロックの使用率を指定する

 PCTUSEDパラメータは,先のPCTFREEに従ってデータ・ブロックが満杯になった後,データ・ブロックの使用率が設定された値を下回るまで,新たな行の挿入を許可しないことを示している(図7[拡大表示])。デフォルトの値は40%である。この場合,データ・ブロックの空き領域が増えていって60%を超えるまでは,空き領域はデータ・ブロック内の行の更新にのみ使用される。

 PCTUSEDを小さく設定すると,Oracleはデータ・ブロックの空きを大きく保とうとする。そのため,更新処理などを行う際に,別のデータ・ブロックを確保しようとする確率が減り,その結果,処理コストも軽減される方向に作用する。ただし,空き領域が増える傾向になるため,領域の利用効率は落ちてしまいがちだ。

 逆にこの値を大きく設定すると,領域の利用効率は改善されるが,更新処理などがデータ・ブロックをまたがる可能性が高まり,処理コストが増大する傾向になる。PCTFREEとPCTUSEDパラメータには,両者の和が100を超えて設定できないという制約がある。この制約の中で,更新処理などの処理コストと領域の利用効率のバランスを取れるかがデータ・ブロックの領域を管理する際のポイントとなる。

インデックスの充てん率にも注意

 データ・ブロックをまたがって移行してしまった行は,各オブジェクトを再編成する事で取り除ける。手順は,(1)対象となる表領域内のオブジェクトをエクスポート・ユーティリティ(EXPORT)を使用してバックアップし,(2)表領域,および物理ファイルを削除して再作成を行い,(3)バックアップしたオブジェクトをインポート・ユーティリティ(IMPORT)を使用して復元する*3

 インデックスも定期的に再編成した方が良いだろう。インデックスは,DELETEやINSERT文が繰り返し発行されると,データのパッキング率が低下する(つまり空きの多い状態になる)ため,スペースの利用効率が悪化してくる。さらに,データの入っていないリーフ・ページ*が多く存在することにもつながる。その結果,インデックス・サーチを実行した際により多くのリーフ・ページを読み込まなければならなくなり,パフォーマンスにも悪影響を及ぼすのである。

 インデックスをメンテナンスする方法は2つある。一つは,インデックスを削除(DROP)した後にもう一度作成(CREATE)する方法。もう一つはインデックスを再編成(REBUILD)する方法である。前者は,インデックスを物理的に削除して,新規に作成する方法だ。そのため,この作業に必要なディスク容量はそのインデックスが確保している領域分だけで済む。ただし,データを読みながらソート処理を行った上でインデックスを作成するため,処理に時間がかかる。

 一方のREBUILDは,元のインデックス(ソート処理済み)を使って別のインデックスを作成するため,作業時のディスク容量は単純に言えば該当インデックス領域の2倍が必要になる。その半面,ソート処理を改めて行う必要がないため,削除して作成し直すよりも処理時間は短くて済む。どちらの方法を選択するかは,そのシステムのリソース条件や許容される作業時間などを基に決めることになる。

(内藤 尚=システムコンサルタント オープンシステム統括部 マネージャー)