大量にデータを投入しているテーブルに対してIndexを作成するときの備忘録
大量にデータが投入されているテーブルで、遅いSQLがあると相談を受けた。
確認してみると、効率の悪そうなIndexがあり、Indexの項目を増やして作成しなおし検証環境で試したところ劇的に早くなった。
これを本番環境に作成すればめでたし、めでたしとなる予定であった。
しかし、世間の風は冷たかった。。。
このテーブルがでかい。
なんでこんなにでかいのってくらいでかい。
簡単に試算した結果、Indexの作成だけで3日もかかってしまう。
そんなときに、試したIndex高速化の備忘録です。
まずはテーブル作成
create table index_test01 (id number,text varchar2(10));
次にデータを挿入
とりあえず、Index作成の違いがわかるくらいにはデータを入れる。
insert into index_test01 (select level,rpad(level,10,'AA') from dual connect by level<=1000000);
※検証環境はSGAに2GBしかとれなかったため、CONNECT BY操作のメモリが足りず1000000レコードになりました。
さて、準備が終わりお待ちかねのINDEX作成
create index idx01 on index_test(id);
経過: 00:00:02.18
drop index idx01;
create index idx01 on index_test(id) parallel 2;
経過:00:00:01:62
drop index idx01;
create index idx01 on index_test(id) parallel 4;
経過:00:00:01:34
drop index idx01;
create index idx01 on index_test(id) parallel 16;
経過:00:00:01:25
ほぼ、経過時間が頭打ちになった。これ以上やってもあまり結果は得られなそうなのでここでやめた。
データ量を増やしてcpu_countを増やして、など色々とやっていくとまだまだINDEX作成の効率は良くなりそうではあるが。