Oracle データ圧縮① [DBMS]
圧縮と一言で言っても何を又は何処を圧縮するのか、Oracleの圧縮といってもいろいろあります。
INDEXの圧縮からだいぶ間が空きましたが、今度はデータ圧縮をしてみます。
Oracle 11g では基本圧縮(BASIC) と OLTP表圧縮(FOR OLTP) の2種類の圧縮方法があります。
基本圧縮には EnterpriseEdition が必要で、OLTP表圧縮にはさらに Advanced Compression Option が必要になります。
既存の表データを圧縮するには以下の様なDMLになります。
・基本圧縮
alter table "SAPSR3"."D010TAB" move compress basic;
・OLTP表圧縮
alter table "SAPSR3"."D010TAB" move compress for oltp;
・圧縮解除
alter table "SAPSR3"."D010TAB" move nocompress;
D010TAB がテーブルで、SAPSR3 はスキーマになります。
インデックスの圧縮とは圧縮アルゴリズムが違うので接頭辞は付きません。
注意事項として、データの圧縮/解除を行った場合、そのテーブルのインデックスを全て再構築する必要があります。
MOVE は ROWID が変更されるからだそうです。
D010TAB~0やD010TAB~1といったインデックスがあった場合は以下の様に再構築します。
alter index "SAPSR3"."D010TAB~0" rebuild parallel 1 pctfree 1;
alter index "SAPSR3"."D010TAB~1" rebuild parallel 1 pctfree 1;
最初、これに気が付かなかったので悲惨な事になりました。
インデックスが無い場合よりアクセス時間がひどかったです。
では、圧縮してみます。
その前に圧縮前の状態です。
テーブルが圧縮されているかどうかは USER_TABLES テーブルの COMPRESSION が DISABLE/ENABLE で判断出来、COMPRESS_FOR で BASIC/OLTP の圧縮タイプが分かります。
テーブルのバイト数は USER_SEGMENTS テーブルの BYTE にあるので、圧縮前後で比較します。
まずは基本圧縮で圧縮してみました。
alter table "SAPSR3"."D010TAB" move compress basic;
16,777,216→7,340,032(約43.8%)
けっこう圧縮されました。
次にOLTP表圧縮で圧縮です。
alter table "SAPSR3"."D010TAB" move compress for oltp;
16,777,216→7,340,032(約43.8%)
お?一緒ですね。
この後、いろいろなテーブルを圧縮してみましたが、基本圧縮とOLTP表圧縮は圧縮後のサイズが同じだったり違ったり、圧縮アルゴリズムが違うので違って当然です。
ただ、OLTP表圧縮だからといって、基本圧縮より圧縮率が必ず高いという訳ではない様です。
圧縮した方が大きくなるケースもある様です。
INDEXの圧縮からだいぶ間が空きましたが、今度はデータ圧縮をしてみます。
Oracle 11g では基本圧縮(BASIC) と OLTP表圧縮(FOR OLTP) の2種類の圧縮方法があります。
基本圧縮には EnterpriseEdition が必要で、OLTP表圧縮にはさらに Advanced Compression Option が必要になります。
既存の表データを圧縮するには以下の様なDMLになります。
・基本圧縮
alter table "SAPSR3"."D010TAB" move compress basic;
・OLTP表圧縮
alter table "SAPSR3"."D010TAB" move compress for oltp;
・圧縮解除
alter table "SAPSR3"."D010TAB" move nocompress;
D010TAB がテーブルで、SAPSR3 はスキーマになります。
インデックスの圧縮とは圧縮アルゴリズムが違うので接頭辞は付きません。
注意事項として、データの圧縮/解除を行った場合、そのテーブルのインデックスを全て再構築する必要があります。
MOVE は ROWID が変更されるからだそうです。
D010TAB~0やD010TAB~1といったインデックスがあった場合は以下の様に再構築します。
alter index "SAPSR3"."D010TAB~0" rebuild parallel 1 pctfree 1;
alter index "SAPSR3"."D010TAB~1" rebuild parallel 1 pctfree 1;
最初、これに気が付かなかったので悲惨な事になりました。
インデックスが無い場合よりアクセス時間がひどかったです。
では、圧縮してみます。
その前に圧縮前の状態です。
テーブルが圧縮されているかどうかは USER_TABLES テーブルの COMPRESSION が DISABLE/ENABLE で判断出来、COMPRESS_FOR で BASIC/OLTP の圧縮タイプが分かります。
テーブルのバイト数は USER_SEGMENTS テーブルの BYTE にあるので、圧縮前後で比較します。
まずは基本圧縮で圧縮してみました。
alter table "SAPSR3"."D010TAB" move compress basic;
16,777,216→7,340,032(約43.8%)
けっこう圧縮されました。
次にOLTP表圧縮で圧縮です。
alter table "SAPSR3"."D010TAB" move compress for oltp;
16,777,216→7,340,032(約43.8%)
お?一緒ですね。
この後、いろいろなテーブルを圧縮してみましたが、基本圧縮とOLTP表圧縮は圧縮後のサイズが同じだったり違ったり、圧縮アルゴリズムが違うので違って当然です。
ただ、OLTP表圧縮だからといって、基本圧縮より圧縮率が必ず高いという訳ではない様です。
圧縮した方が大きくなるケースもある様です。
コメント 0