小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracleでinsert文にAPPEND_VALUESヒント書いたら遅くなった件

はじめに

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 はてなブックマーク - APPEND_VALUESの間違った使い方をしてみる - kagamihogeのblog

大量データを手っ取り早くinsertしたいなら、insert into select〜か、バルクインサート使えということらしいです。