Bulk insert into table partitionnée et verrou au niveau de la table

Je veux savoir la raison de base(la mécanique des segments, des blocs, des verrous que le moteur ne) pourquoi bulk insert(avec direct-chemin) verrouille l'ensemble de la table, donc si je l'insérer dans une partition, je ne peux pas tronquer une autre partition qui n'est pas affecté(apparemment) par insert.

Un classique insérer(sans ajouter de l'indice) permet de tronquer certaines non partitions.(Notez que je parle de non-engagés transaction.)

Ci-dessous un exemple de ilustrate.

Soit un tableau:

 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;

Session 1:

insert into table fg_test select * from fg_test where col >=1000;
--1 rows inserted;

Session 2:

alter table fg_test truncate partition p1;
--table truncated

Session 1:

rollback;
insert /*+append */ into table fg_test select * from fg_test where col >=1000;
--1 rows inserted;

Session 2:

alter table fg_test truncate partition p1;
--this throws ORA-00054: resource busy and acquire with NOWAIT specified 
--or timeout expired

La Doc sur Diret-Chemin Insérer est assez brusque sur ce sujet et dit tout simplement:

Lors de l'-chemin de l'INSERTION, de la base de données obtient des verrous exclusifs sur les
tableau (ou sur toutes les partitions d'une table partitionnée). Comme un résultat,
les utilisateurs ne peuvent pas effectuer toutes les instructions insert, update ou delete
les opérations sur la table, et concurrente de la création d'index et de construire
les opérations ne sont pas autorisées.

La Comment Direct-Chemin INSÉRER Oeuvres ne permet pas d'expliquer pourquoi la serrure est nécessaire pour toutes les partitions.
Et pourquoi conventionnelle insertion ne se verrouille pas non partitions? (Mon intuition est que le verrouillage se fait au niveau du bloc)

Classique insérer des verrous au niveau de la ligne, avec la définition de la table également protégés par un verrou partagé pour éviter d'être modifiée. Il n'y a pas de niveau de bloc d'écluses de l'Oracle, il est tout de ligne, (sous -) partition ou de la table.

OriginalL'auteur Florin Ghita | 2013-05-10