SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLEシステム手続き

SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLEシステム手続きを使って、表や索引に割り当てられた未使用の領域を回収することができます。 未利用の割り当てられた領域が存在する典型的な状況は、表から大規模な情報が情報が削除された後、それで空いた領域を使う情報が挿入されていない場合です。 既定ではDerbyは未使用の領域を基本ソフト(OS)に返却しません。例えば表や索引に割り当てられたページは、表や索引が破棄されるまでは基本ソフト(OS)に返却されません。 SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLEにより使われていない領域を基本ソフト(OS)に返却することができます。

このシステム手続きにより、三種類の圧縮をSQL表の記録された領域にて行います。 その三種類とはPURGE_ROWSDEFRAGMENT_ROWSそれと TRUNCATE_ENDです。またSYSCS_UTIL.SYSCS_COMPRESS_TABLE()とは異なり、既存の表および索引が記録された領域だけを使って全処理が行われます。

構文

SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(
		IN SCHEMANAME VARCHAR(128),
		IN TABLENAME VARCHAR(128),
		IN PURGE_ROWS SMALLINT,
		IN DEFRAGMENT_ROWS SMALLINT,
		IN TRUNCATE_END SMALLINT )
SCHEMANAME
この引数はVARCHAR(128)型の値をとり、表のあるスキーマを指定します。空の値を渡すとエラーとなります。
TABLENAME
この引数はVARCHAR(128)型の値をとり、表の表名を指定します。文字列と表名は、大文字小文字も一致していなければならず、"Fred"と引数にとれば、SQLのレベルでデリミトされた識別子の'Fred'となります。 空の値を渡すとエラーとなります。
PURGE_ROWS
PURGE_ROWSが0以外の値であった場合、表全体が一度走査されて、表から削除とコミットが完了した行が取り除かれます。こうして空いた領域は、以降の行の挿入にて利用できますが、表に割り当てられたままとなります。 このオプションをとる場合は表の全ページが走査されるので、パフォーマンスは表のサイズに正比例します。
DEFRAGMENT_ROWS
DEFRAGMENT_ROWSが0以外の値であった場合、表にある行を後方から前方に移動する、断片化解消の走査が一度行われます。 この断片化解消の走査は、表の末尾にあるページを空にしようとします。こうしてできた空のページは、続いてTRUNCATE_ENDを指定して基本ソフト(OS)に返却可能となります。 TRUNCATE_ENDを指定する時は、DEFRAGMENT_ROWSを指定する事をお勧めします。 DEFRAGMENT_ROWSが指定されると、表の全体が走査され、移動した表の全行について索引が更新されます。従って実行時間は表のサイズに正比例します。
TRUNCATE_END
TRUNCATE_ENDが0以外の値であった場合、表の末尾にある隣接したページを基本ソフト(OS)に返却しようとします。PURGE_ROWSとDEFRAGMENT_ROWSの両方あるいは片方を同時に指定することで、処理の対象となるページ数を増やす事ができます。この処理自身は表の走査は行われません。

SQLの例

USというスキーマにあるCUSTOMERという表を圧縮するために、全ての圧縮処理を指定します。
call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('US', 'CUSTOMER', 1, 1, 1);
同じ表の末尾にある空き領域を返すなら、全ての処理を指定するより次のように呼び出す方が、処理が短時間で済みます。しかし返却される領域は少なくなるでしょう。
call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('US', 'CUSTOMER', 0, 0, 1);

Javaの例

USというスキーマにあるCUSTOMERという表を圧縮するために、全ての圧縮処理を指定します。
CallableStatement cs = conn.prepareCall
("CALL SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(?, ?, ?, ?, ?)");
cs.setString(1, "US");
cs.setString(2, "CUSTOMER");
cs.setShort(3, (short) 1);
cs.setShort(4, (short) 1);
cs.setShort(5, (short) 1);
cs.execute();
同じ表の末尾にある空き領域を返すなら、全ての処理を指定するより次のように呼び出す方が、処理が短時間で済みます。しかし返却される領域は少なくなるでしょう。
CallableStatement cs = conn.prepareCall
("CALL SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(?, ?, ?, ?, ?)");
cs.setString(1, "US");
cs.setString(2, "CUSTOMER");
cs.setShort(3, (short) 0);
cs.setShort(4, (short) 0);
cs.setShort(5, (short) 1);
cs.execute();
ヒント: SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE手続きは、自動コミットモードで実行する事をお勧めします。
注: この手続きは圧縮する表に排他表ロックを必要とします。表やその索引へのあらゆる文の計画は無効となります。利用されていない領域を識別する方法については、Derby サーバと管理ガイドを参照してください。