- 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