我想知道为什么批量插入(使用直接路径)锁定整个表的核心原因(引擎所做的段、块、锁的机制),所以如果我插入一个分区,我不能截断另一个分区不受插入的影响(显然)。
传统的插入(没有附加提示)允许截断一些不受影响的分区。(注意我说的是非提交事务。)
下面一个例子来说明它。
让我们成为一张桌子:
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 上的文档在这个主题上非常突然,只是说:
在直接路径插入期间,数据库获取表(或分区表的所有分区)上的排他锁。因此,用户无法对表执行任何并发插入、更新或删除操作,并且不允许并发索引创建和构建操作。
Direct-Path INSERT 的工作原理没有解释为什么所有分区都需要锁定。为什么传统的插入不会锁定不受影响的分区?(我的直觉是锁定是在块级别完成的)