11.1.3 pdreclaimの機能
pdreclaimには,次の二つの機能があります。
-
表の使用中空きページ解放
-
インデクスの使用中空きページ解放
-j又は-aオプションなしでpdreclaimを実行すると,使用中空きページの解放をします。その結果,使用中空きセグメントが発生した場合に,-jオプションありのpdreclaimを実行すると,使用中空きセグメントの解放をします。また,-aオプションありのpdreclaimを実行した場合は,使用中空きページの解放,及び使用中空きセグメントの解放をします。
-j又は-aオプション有無によるpdreclaimの実行可否を次に示します。
pdreclaimのオプション指定 |
使用中空きページの解放 |
使用中空きセグメントの解放 |
---|---|---|
-j又は-aオプションなし |
○ |
× |
-jオプションあり |
× |
○ |
-aオプションあり |
○ |
○ |
- (凡例)
-
○:実行します。
×:実行しません。
したがって,使用中空きページの解放をしないで,使用中空きセグメントの解放だけをすることはできません。ただし,次の操作をした場合,-j又は-aオプションなしのpdreclaimで使用中空きページの解放をしなくても使用中空きセグメントが発生するため,-jオプションありのpdreclaimで使用中空きセグメントの解放ができます。
-
表に排他が掛かった状態で,データを削除した場合
-
pdload(option文のnowaitオペランドにyesを指定)が,データロード中に異常終了してロールバックした場合
-
表の使用中空きページ解放の効果
表の使用中空きページ解放をすると,次の効果があります。
-
全件検索性能の改善
全件検索実行時に参照していた使用率0%のページが未使用ページとなるため,参照をスキップするようになり,全件検索の性能が向上します。
-
分岐行のINSERT文,UPDATE文実行時のエラー回避
未使用ページがなくなると,分岐行のINSERT文,UPDATE文はエラー(KFPA11756-E)となりますが,使用率0%のページを未使用ページにすることでエラーを回避できます。
-
INSERT文,UPDATE文実行時のページコンパクション処理の回避
すべての使用中空きページについてページコンパクションを一括して実行するため,INSERT文,UPDATE文の延長で実行されるページコンパクションを回避できます。
-
-
インデクスの使用中空きページ解放の効果
インデクスの使用中空きページ解放をすると,次の効果があります。
-
使用中空きページがあるのにエリア不足となる現象を回避できます。
-
インデクス検索実行時に,使用中空きページを参照するために発生する性能劣化を回避できます。
-
インデクスの使用中空きページ解放実行後の,未使用ページ割り当て処理は,使用中空き領域サーチ処理で解放した未使用ページを優先して割り当てます。使用中セグメント内の未使用ページを優先して割り当てるため,領域が有効活用できて,使用中空き領域サーチ処理時のオーバヘッドも削減できます。
- 〈この項の構成〉
(1) 表の使用中空きページ解放
表の使用中空きページ解放の概要を次の図に示します。
表の使用中空きページ解放では,使用中空きセグメントの解放,使用中空きページの解放,及びページコンパクションの実行有無を選択できます。なお,LOB列,及びLOB属性の抽象データ型列に対して,表の使用中空きページ解放は適用できません。
-
使用中空きセグメントの解放,及び使用中空きページの解放
データを大量に削除した場合,格納データが1件もないのに割り当てられたままとなる使用中空きページが発生します。SEGMENT REUSE表(CREATE TABLE又はALTER TABLEでSEGMENT REUSEオプションを指定した表)でない場合,HiRDBは未使用ページ,及び未使用セグメントを使用する格納方式となっています。この新規領域が確保できなくなると使用中空きページを再利用しますが,再利用する場合は使用中ページ内の空き領域をサーチするオーバヘッドが発生し,新規領域確保に比べて性能が劣化します。また,SEGMENT REUSE表であっても,使用中空きページがある状態では全件検索などでむだなページを検索していることになります。さらに,再利用できるのは該当する使用中セグメントの表,又はインデクスに限ります。
pdreclaimを実行すると,すぐには再利用されない使用中空きページが解放されるため,次の効果があります。
-
すべてのデータが削除されたセグメントは未使用セグメントとなり,すべての表及びインデクスで再利用できるようになります。
-
すべてのデータが削除されたページは未使用ページとなるため,該当する使用中セグメントの表で再利用できます。特に,SEGMENT REUSE表の場合,再利用するページをサーチするオーバヘッドが削減されるため,効果が大きいです。
1.の効果として,同一RDエリアに複数の表を格納している場合,表Aがデータを格納していない使用中空きセグメントを保持しているために,表Bが新たな未使用セグメントを確保できないでRDエリアの容量不足となることを回避できます。同一RDエリアに複数の表を格納している場合のpdreclaimの効果を次の図に示します。
-
表のぺージコンパクション
表のページコンパクションの概要を次の図に示します。
- 〔説明〕
-
pdreclaim実行前の状態では,削除された行2及び行5より長いデータは,行2及び行5の削除で発生した空き領域をそのまま使用して格納することはできません。この場合,空き領域を連続領域にすれば格納できます。この散在している空き領域を連続領域に詰め替える動作を,ページコンパクションといいます。ページコンパクションは,SQLの延長でも実行されます。ただし,SQLの延長で実行される場合は,オンライン性能が劣化するため,事前にpdreclaimでページコンパクションをしておくことで,オンライン中の性能劣化を回避できます。なお,ページコンパクションが発生すると,入出力処理の負荷が高くなります。
(2) インデクスの使用中空きページ解放
インデクスの使用中空きページ解放の概要を次の図に示します。
インデクスの使用中空きページ解放では,使用中空きセグメントの解放,又は使用中空きページの解放のどちらを行うか選択できます。なお,プラグインインデクスに対して,インデクスの使用中空きページ解放は適用できません。
-
使用中空きセグメントの解放,及び使用中空きページの解放
インデクスの場合も表と同様に,大量にデータを削除すると,再利用できない使用中空きページが発生します。特に,過去のキー値の小さいデータを削除して使用中空きページになった領域は,再度同じキー値が格納された場合に備えて確保状態(ポインタでつながったまま)が続くため,新規のキー値の大きいデータを追加するときに使用中空きページの再利用もされません。このため,単調に格納データのキー値が増加し,過去のデータを削除する運用形態では,再利用できない使用中空きページが大量に発生します。このインデクスに対してpdreclaimを実行すると,使用中空きページを解放して未使用ページとするため,大きいキー値のデータを格納できるようになります。また,下位ページポインタを持たない中間ページも未使用ページにできます。
-
インデクスのページコンパクション
インデクスのページコンパクションの概要を次の図に示します。
- 〔説明〕
-
pdreclaim実行前の状態では,削除されたキー2及びキー5は残存エントリとして残っています。この残存エントリを解放して,連続領域に詰め替える動作をページコンパクションといいます。ページコンパクションはSQLの延長でも実行されます。ただし,SQLの延長で実行される場合は,オンライン性能が劣化するため,事前にpdreclaimでページコンパクションを実行しておくことで,オンライン中の性能劣化を回避できます。なお,ページコンパクションが発生すると,入出力処理の負荷が高くなります。
また,残存エントリがあると,排他待ち又はデッドロックが発生することがあります。pdreclaimでページコンパクションを実行しておくことで,排他待ち又はデッドロックも回避できます。
インデクスの残存エントリ,及びユニークインデクスの残存エントリについては,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。