Sunday, June 20, 2010

INSERT...VALUESコマンドとAPPENDヒント

1つの行のインサートにAPPENDヒントを用いたDirect Path Modeが必要なのかよく分かりません。とにかく、オラクルは11gからこのようなモードを支援するようにしました。すなわちINSERT...VALUES...コマンドでもAPPENDヒントが動作するように修正されました。もっと詳細に整理してみれば...

  • Oracle 10gまではINSERT...VALUES...コマンドにAPPENDヒントを与えても無視されます。すなわち、APPENDヒントはINSERT...SELECT...コマンドでだけ動作します。

  • APPENDヒントによってDirect Path Modeで動作すると行をインサートするとき現在セグメントの空きブロックを無視し(同時にバッファーキャッシュを経緯しなくて)セグメントのHigh Water MarkのあとにAppendさせてしまいます。したがって大量のデータを追加する時速度は速いがデータファイルにその分不要な空き容量が残りかねません。(でもこの空き容量もあとで使用されるはずです)

  • Oracle 11gR1ではINSERT...VALUES...コマンドでもAPPENDヒントが動作します。隠しパラメーター_direct_path_insert_featuresで制御できます。

  • Oracle 11gR2ではINSERT...VALUES...コマンドでAPPENDヒントを与えて無視されます。かわりにAPPEND_VALUESというヒントが追加されました。すなわちAPPEND_VALUESヒントを使用すればINSERT...VALUES...コマンドでもDirect Path Modeでインサートされます。

少し複雑になったでしょう。下記は簡単なテスト結果です。

create table t1(c1 number);

insert into t1 values(1);
commit;
insert into t1 values(2);
commit;

-- (2件の行をインサートして、Conventional Path Modeであるため二つの行が同じブロックにあるはずです)
select
dbms_rowid.rowid_relative_fno(rowid) as file#,
dbms_rowid.rowid_block_number(rowid) as block#
from t1;

-- 10.2.0.1
FILE# BLOCK#
---------- ----------
4 853
4 853

-- 11.1.0.6
FILE# BLOCK#
---------- ----------
4 758
4 758

-- (APPENDヒントが与えられたINSERT...VALUES...コマンドです)
insert /*+ append */ into t1 values(3);
commit;

-- 10.2.0.1ではAPPENDヒントが無視されるためやはり同じブロックにインサートされます。
FILE# BLOCK#
---------- ----------
4 853
4 853
4 853

-- でも11.1.0.6ではAPPENDヒントが動作し、その結果High Water Markの以後にインサートされてしまいます。
FILE# BLOCK#
---------- ----------
4 758
4 758
4 769

-- 11.2.0.1ではAPPEND_VALUESヒントがその役割を代わります。
iinsert /*+ append_values */ into t1 values(3);
commit;

FILE# BLOCK#
---------- ----------
4 526
4 526
4 528

なぜオラクル開発者たちが急にINSERT...VALUES...コマンドでもAPPENDヒントが動作することに変えたんでしょうか。いくら考えてみてもわかりません。誰かその理由が浮かんでくる方あります?

No comments:

Post a Comment