たまに遅い&大量のINSERT処理のチューニング方法

ここでは、ORACLE SQLでたまに遅いときがあるINSERT処理の特徴とチューニング方法を紹介します。

INSERT文の基本的なチューニングについては、↓の記事でも紹介しています。
>>INSERT文のSQLチューニング方法

INSERT文を速くしようと思うと、APPENDヒントを使ったダイレクトパスインサートやパラレル処理などがあります。
これらが有効なのは、1本のSQLで大量のデータを処理する場合です。

例えば、ジョブ自体、プログラム自体が並列で多数実行され、1つのテーブルに対して、大量のINSERT文が実行される場合には、あまり有効ではありません。なんせダイレクトパスインサートは表ロックがかかるので使えませんし、パラレル実行もほとんど効果を発揮しません。

そういった場合には、主キーを逆キーにすることを試してみると良いと思います。

逆キーとは、インデックス(索引)の種類の一つで、インデックスの値を逆ビット順に格納します。それにより通常のインデックスとは登録される値の大小関係が変化し、連続したキーでも異なるブロックに挿入され易くなります。

例えば、主キーをシーケンスや何かの連番など、連続した値で登録している時に有効です。

これを使って劇的に処理時間が短縮されるかというと、そうではありませんが、ジョブを並列で実行している処理で、連続したキー値でINSERTを行っているときに処理時間をある程度均一に安定させてくれます。

私がチューニングした時は、ジョブが4並列で、1ジョブ当たり平均25分で、3回に1回は30分を超えるという状況でした。そこで逆キーを試したところ、常に安定して24分くらいになりました。

状況によって効果の出方も変わってくるので、一度試してみると良いと思います。

ちなみに私はRAC環境で試しましたが、シングル環境でも効果はあるそうです。

※注意点
逆キーインデックスにすると、通常のインデックスのように検索には使えません。本当にただの連番、代理キーのような形で使われているものに限定して使ってみてください。

◆逆キーインデックスの作成方法

create index pk_table1 on table1 (col1) reverse;
;

◆逆キーインデックスへの変更

alter index pk_table1 rebuild reverse;
;