はじめに
Oracle12cR2でインデックスの圧縮機能として拡張索引圧縮のHIGHレベルが追加されました。
LOWレベルよりも圧縮率が高いということで使ってみようかと調べていたら、以下の記事を見つけました。
記事を見るとINSERTとUPDATEの性能が大幅に落ちています。どうも圧縮率とSELECTの性能は高いが、INSERTとUPDATE時は厳しいようです。
自分の環境でも同じ結果となるか試してみます。
※翻訳記事ではないので、解説は元の記事を参照してください。
非圧縮の場合
まずは非圧縮で試してみます。
SQL> create table bowie (id number, code number, name varchar2(42));
表が作成されました。
SQL> create index bowie_code_idx on bowie(code) nocompress;
索引が作成されました。
SQL> insert into bowie select rownum, rownum, 'ZIGGY STARDUST'
from dual connect by level <= 1000000;
1000000行が作成されました。
経過: 00:00:02.42
SQL> commit;
SQL> update bowie set code = 42 where id between 250000 and 499999;
250000行が更新されました。
経過: 00:00:03.34
100万行のINSERTに2.42秒、25万行のUPDATEに3.34秒かかりました。
拡張索引圧縮のHIGHレベルの場合
次に拡張索引圧縮のHIGHレベルで試してみます。
SQL> create table bowie (id number, code number, name varchar2(42));
表が作成されました。
SQL> create index bowie_code_idx on bowie(code) compress advanced high;
索引が作成されました。
SQL> insert into bowie select rownum, rownum, 'ZIGGY STARDUST' from dual connect by level <= 1000000;
1000000行が作成されました。
経過: 00:00:12.82
SQL> commit;
コミットが完了しました。
SQL> update bowie set code = 42 where id between 250000 and 499999;
250000行が更新されました。
経過: 00:00:12.47
100万行のINSERTに12.82秒、25万行のUPDATEに12.47秒かかりました。
非圧縮の場合は100万行のINSERTに2.42秒、25万行のUPDATEに3.34秒だったので、大幅に時間がかかっています。
拡張索引圧縮のLOWレベルの場合
参照した記事では試していなかったのですが、拡張索引圧縮のLOWレベルでも試してみます。
SQL> create table bowie (id number, code number, name varchar2(42));
表が作成されました。
SQL> create index bowie_code_idx on bowie(code) compress advanced low;
索引が作成されました。
SQL> insert into bowie select rownum, rownum, 'ZIGGY STARDUST' from dual connect by level <= 1000000;
1000000行が作成されました。
経過: 00:00:02.61
SQL> commit;
コミットが完了しました。
SQL> update bowie set code = 42 where id between 250000 and 499999;
250000行が更新されました。
経過: 00:00:03.80
100万行のINSERTに2.61秒、25万行のUPDATEに3.8秒かかりました。
非圧縮の場合は100万行のINSERTに2.42秒、25万行のUPDATEに3.34秒だったので、大きな差はないですね。
※この結果になったのは圧縮がほとんどかからないインデックスだったからかもしれません。
※そもそも複数列のインデックスじゃないと駄目だったような・・・
最後に
拡張索引圧縮のHIGHレベルではINSERTとUPDATEの性能が大幅に悪化していましたが、これはHIGHレベルが使えないということではありません(念のため)。
機能の特性をよく理解して、適切な使い方をしないといけないということです。
ちなみにリーフブロック数はそれぞれ以下のようになりました。
無圧縮:2862
LOW:2788
HIGH:1509
今回は勉強になりました。
おわり。