FC2ブログ

晴川雨読

晴れている時は川へ、雨の日は川に関する情報収集をします。

APPEND ヒントの誤った使い方

APPENDヒント」というのがある。
DIRECT PATH INSERT してね、っというヒントである。
DIRECT PATHの何がうれしいかと言うと、バッファキャッシュを経由せずに直接データファイルに書き込むので速いというメリットがある。
しかし、主に次のデメリットがある。
①HWMが上がる。
 ⇒データファイルが膨れるばかり。
②テーブル(パーティション)をロックする
 ⇒同時実行性が制限される
③コミットしないとINSERTしたレコードを参照できない
ダイレクト・パス・インサートの使用上の注意」にまとめられている。
アプリを組む上で、②③が特に問題になる。

③でおバカな作りになっているストアドプロシージャを最近見た。

1つのプロシージャでDIRECT INSERT&COMMITして、その後別の処理をした後COMMITしている。
1個目のトランザクションの後でエラーとなった時にリカバリーできる作りになっていないのである。
DIRECT INSERTしたものを手で消さないとリラん出来ないダメな作り。
しかも、DIRECT INSERTがそれほど大量の書き込みではないと来る。

TRUNCATE⇒DIRECT INSERT みたいに、一時表では役に立たない場合のワークテーブルへの書き込みになどに限定して使うべき。

ただのINSERT INTO VALUESにAPPENDヒントを付けてあるケースもあった。
APPEND_VALUESヒント」じゃないと効かんのによ。
何も考えず、何も理解せず実装しているんだな~というのが良くわかる。

APPEND_VALUES も1件登録するだけのSQLには意味がなく、
バルクインサートするなどチューニングしても性能要件を満たせない場合に+αとして使うべき。
マニュアルにも次のように書いてあるしね。

APPEND_VALUESヒントを使用すると、パフォーマンスを大幅に向上できます。次に使用方法の例を示します
・ Oracle Call Interface(OCI)を使用するプログラムで、大規模な配列バインドまたは行コールバックを伴う配列バインドを使用する場合
・PL/SQLで、VALUES句とともにINSERT文を使用するFORALLループを伴う多くの行をロードする場合


スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://ncdkayak.blog.fc2.com/tb.php/52-05ad9451
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad