主要な理由 (エンジンが行うセグメント、ブロック、ロックの仕組み) を知りたい挿入によって(明らかに)影響を受けません。
従来の挿入 (追加ヒントなし) では、影響を受けていないパーティションを切り捨てることができます (コミットされていないトランザクションについて話していることに注意してください)。
それを説明するための例を以下に示します。
テーブルにしましょう:
CREATE TABLE FG_TEST
(COL NUMBER )
PARTITION BY RANGE (COL)
(PARTITION "P1" VALUES LESS THAN (1000),
PARTITION "P2" VALUES LESS THAN (2000));
Insert into table fg_test values (1);
insert into table fg_test values (1000);
commit;
セッション 1:
insert into table fg_test select * from fg_test where col >=1000;
--1 rows inserted;
セッション 2:
alter table fg_test truncate partition p1;
--table truncated
セッション 1:
rollback;
insert /*+append */ into table fg_test select * from fg_test where col >=1000;
--1 rows inserted;
セッション 2:
alter table fg_test truncate partition p1;
--this throws ORA-00054: resource busy and acquire with NOWAIT specified
--or timeout expired
Diret-Path InsertのDocは、この件に関してかなり唐突で、次のように述べています。
ダイレクト・パス INSERT 中、データベースは表 (またはパーティション化された表のすべてのパーティション) に対して排他ロックを取得します。その結果、ユーザーはテーブルに対して同時挿入、更新、または削除操作を実行できず、同時インデックス作成および構築操作は許可されません。
How Direct-Path INSERT Worksは、すべてのパーティションにロックが必要な理由を説明していません。また、従来の挿入では、影響を受けていないパーティションがロックされないのはなぜですか? (私の直感では、ロックはブロックレベルで行われます)