はじめに
Oracleでinsert文を繰り返し実行して大量の初期データを登録するような処理を高速化したいと思って調べていたら、APPEND_VALUESヒントを指定すると高速化できるという記事を見つけました。
実際試してみたら、APPEND_VALUESの指定がないほうが全然速くて、なんでだろうと思っていたら使い方を間違っていました。
APPEND_VALUESヒントとダイレクトパスインサート
APPEND_VALUESヒントは以下のように使います。
INSERT /*+ APPEND_VALUES */ INTO テーブル VALUES ('あいう') ;
APPEND_VALUESヒントとダイレクトパスインサートの関係については、以下のサイトが詳しく書かれています。
APPEND_VALUESヒントを使うと遅くなる理由
使用ブロック数が桁違いに多い。それだけのブロックを確保しなければならないのだから、かなり遅くなるのは当然と言える。ダイレクトパスインサートの説明として、よく「HWMの後ろにデータを入れる」という書かれ方がある。この検証用プログラムの動作は、INSERT一回ごとにHWMの後ろにデータを入れていってしまうことになるため、相当無駄なことをやっているに等しい。
「INSERTにAPPEND_VALUESヒントとやらを付けると早くなるらしい」というあやふやな理解でダイレクトパスインサートを使用してはいけない(戒め)
APPEND_VALUESの間違った使い方をしてみる - kagamihogeのblog
大量データを手っ取り早くinsertしたいなら、insert into select〜か、バルクインサート使えということらしいです。