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)
OriginalL'auteur Florin Ghita | 2013-05-10
Vous devez vous connecter pour publier un commentaire.
Votre site est un peu mal. Un chemin d'insertion ne permet pas de verrouiller l'ensemble de la table si vous utilisez l'extension de la partition de la clause.
Session 1:
Session 2:
La nouvelle question est: Lors de la partition de l'extension de la clause n'est PAS utilisé, pourquoi ne conventionnel et un chemin de plaquettes ont différents mécanismes de verrouillage? Cette précision rend la question plus facile, mais sans connaissance de la réponse ci-dessous n'est encore qu'une supposition.
Il était plus facile de coder une fonctionnalité de verrouillage de la table entière. Et il est plus rapide, car il n'est pas nécessaire pour suivre les partitions sont mises à jour.
Il n'y a habituellement pas besoin de plus pour un verrou de granularité fine. La plupart des systèmes ou des processus que l'utilisation directe de chemin d'accès n'écrit que la mise à jour d'une grande table à la fois. Si une plus fine lock est vraiment nécessaire, l'extension de la partition clause peut être utilisée. Ce n'est pas tout à fait aussi pratique, car seule une partition peut être référencé à la fois. Mais il est assez bon 99,9% du temps.
Donc, Si j'utilise un chemin direct insérer dans une table à l'aide de l'extension de la partition, la partition serait toujours enfermé dans cette session jusqu'à ce qu'un
COMMIT
est émis. Est-ce exact? Je ne suis même pas sûr si "partition de verrouillage" est même une chose, pardon de mon ignorance.OriginalL'auteur Jon Heller
J'ai trouvé la réponse sur follwing asktom.oracle.com:
Demander à Tom: Insère avec AJOUT de l'Indice
Tom explique bien les rouages, mais la raison pourquoi Oracle verrouille l'ensemble du tableau et pas seulement les partitions affectées est pas encore clair.
Peut-être que c'est juste une décision de conception (par exemple, ne voulant pas l'encombrantes directe de la charge qui pourrait être bloquée par une petite uncommited de transaction et, par conséquent, le verrouillage de toutes les partitions ...)
OriginalL'auteur HAL 9000