コアの理由(エンジンのセグメント、ブロック、ロックの仕組み)を知りたいのですが、ダイレクトパスを使用してバルク挿入がテーブル全体をロックするのはなぜですかパーティションに挿入することで、(明らかに)影響を受けていない別のパーティションを切り捨てることはできません。パーティションテーブルとテーブルレベルロックへのバルク挿入
(APPENDヒントなし)従来のインサートは、いくつかのnonaffectedのパーティションを切り捨てることが可能。(私は非COMMITED取引について話すことに注意してください。)
例以下は、それをilustrateします。
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
Doc on Diret-Path Insertは、このテーマにはかなり急激であるとだけ書かれています:ダイレクト・パス・インサートの間に
、データベースが テーブルの上に排他ロックを取得する(またはすべてのパーティション上のパーティション化された表の)。結果として、 ユーザーは、表に対して 操作を同時に挿入、更新、または削除することはできず、同時索引作成および構築 操作は許可されません。
How Direct-Path INSERT Worksには、すべてのパーティションでロックが必要な理由が説明されていません。 従来のインサートでは影響を受けていないパーティションがロックされないのはなぜですか?私はasktom.oracle.comにfollwing答えを見つけることが
従来の挿入ロックは行レベルでロックされ、テーブル定義も共有ロックによって保護され、変更が防止されます。 Oracleにはブロックレベルのロックはありません。すべての行、(サブ)パーティションまたはテーブルレベルです。 –