SYSCS_UTIL.SYSCS_COMPRESS_TABLEシステム手続きを使って、表や索引に割り当てられている未使用の領域を再利用することができます。
典型的な状況では、割り当てられた未使用の領域は表から大容量の情報が削除された場合や、索引が更新された場合に存在します。既定では、は未使用の領域を基本ソフト(OS)に返却しません。例えばページが表や索引に一度割り当てられると、その表や索引が破棄されるまでは、領域はOSに自動的に返却されません。
SYSCS_UTIL.SYSCS_COMPRESS_TABLEにより利用されていない領域を基本ソフト(OS)に返却できます。
SYSCS_UTIL.SYSCS_COMPRESS_TABLEシステム手続きは索引の再構築処理の一環として、全ての索引の統計情報を更新します。
構文 SYSCS_UTIL.SYSCS_COMPRESS_TABLE (IN SCHEMANAME VARCHAR(128),
IN TABLENAME VARCHAR(128), IN SEQUENTIAL SMALLINT)
- SCHEMANAME
- このVARCHAR(128)の型の引数により、表の存在するスキーマを指定します。空を渡すとエラーとなります。
- TABLENAME
- このVARCHAR(128)の型の引数により、表の表名を指定します。値は大文字小文字も含めて、一致しなければならず、引数に"Fred"と渡すと、SQLレベルでデリミトされた識別子の'Fred'として渡されます。
空の値を渡すとエラーとなります。
- SEQUENTIAL
- 零以外のSMALLINT型の引数を渡すと、シーケンシャルモードで処理を行わせることになり、0を引数に渡すと、シーケンシャルモードでは処理を行わせないこととなります。空の値を渡すとエラーとなります。
SQL の例
SEQUENTIALを指定して、USスキーマにあるCUSTOMERという表を圧縮します。
call SYSCS_UTIL.SYSCS_COMPRESS_TABLE('US', 'CUSTOMER', 1)
Java の例 SEQUENTIALを指定して、USスキーマにあるCUSTOMERという表を圧縮します。
CallableStatement cs = conn.prepareCall
("CALL SYSCS_UTIL.SYSCS_COMPRESS_TABLE(?, ?, ?)");
cs.setString(1, "US");
cs.setString(2, "CUSTOMER");
cs.setShort(3, (short) 1);
cs.execute();
SEQUENTIALの値を特定しない場合、は、表にある全ての索引への処理を並列して処理します。
SEQUENTIALの値を特定しないと、この手続きは多量にメモリを必要として、ディスクの多量の一時領域を使うこととなります。(そのおおよその量は、使われている領域と割り当てられた使われていない領域の2倍ほどです。)
これは表を圧縮するときに、が、
(既存の領域を並べ替えたり切り捨てたりするのではなく、)生きてる行を新規に割り当てた領域に写すからです。余分な領域はCOMMITのとき、基本ソフト(OS)に返されます。
SEQUENTIALの値が特定された場合、は、まず表を圧縮してから個々の索引を順に圧縮します。SEQUENTIALを利用すると、必要なメモリやディスク領域を少なくすることができますが、処理時間はより長くなります。メモリやディスク領域の利用を減らすなら、SEQUENTIALの引数を指定してください。
SYSCS_UTIL.SYSCS_COMPRESS_TABLEは、COMMITが発行されるまでは、ディスクの容量を基本ソフト(OS)に返しません。
つまり表やその索引が占めていた領域は解放されないということです。COMMIT前に基本ソフトに返却されるのは、ソートのために一時的に確保されていたディスク領域だけです。
オートコミットモードでは、SYSCS_UTIL.SYSCS_COMPRESS_TABLEシステム手続きの発行をお勧めします。
この手続きでは、圧縮する表への排他的な表ロックを取得する必要があります。また、表やその索引に依存するすべての文の実行計画は無効となります。利用されていない領域を特定する方法については、を参照してください。