TLDR
Най-вероятно сте забравили да активирате паралелен DML.
ALTER SESSION ENABLE PARALLEL DML;
Допълнително при снасила паралелно изпълнение, което обикновено не правите използвайте паралелни подсказки и обратно.
Примерна настройка (11.2)
create table TAB_HIST (
col1 int,
col2 int,
col3 varchar2(4000))
PARTITION BY RANGE (col1)
interval(1000000)
(
partition p_init values less than (1000000)
);
create table TAB_SRC (
col1 int,
col2 int,
col3 varchar2(4000)
)
PARTITION BY RANGE (col1)
interval(1000000)
(
partition p_init values less than (1000000)
);
insert into tab_src
select rownum, rownum, rpad('x',1000,'y') from dual connect by level <= 100000;
commit;
Вмъкване
Трябва да разрешаване на паралелен DML в първата стъпка
ALTER SESSION ENABLE PARALLEL DML;
Имайте предвид, че алтернативно може да се използва подсказка
INSERT /*+ ENABLE_PARALLEL_DML */ …
Освен това, ако принудите паралелен DML и QUERY, обикновено не използвате паралелни съвети . Намеквам директно вмъкване с APPEND
който често се използва в тази ситуация.
DECLARE
v_parallel_degree NUMBER := 2;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DML PARALLEL ' || v_parallel_degree;
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL QUERY PARALLEL ' || v_parallel_degree;
EXECUTE IMMEDIATE 'INSERT /*+ APPEND */ INTO TAB_HIST
SELECT *
FROM TAB_SRC PARTITION(P_INIT)';
END;
/
Как да проверите дали таблицата е вмъкната паралелно? Най-простият начин е да направите заявка към таблицата (преди да направите комит) - ако получите грешката по-долу, това е паралелно директно вмъкване.
select count(*) from TAB_HIST;
ORA-12838: cannot read/modify an object after modifying it in parallel
Индекс
Ако посочите паралелна степен в create index
израз, който не трябва да активирате или принудително всичко.
DECLARE
v_parallel_degree NUMBER := 2;
BEGIN
EXECUTE IMMEDIATE 'CREATE UNIQUE INDEX idx_pk ON TAB_HIST
(COL1,COL2,COL3)
LOCAL
NOLOGGING PARALLEL ' || v_parallel_degree;
END;
/
Проверката е толкова проста, колкото да погледнете степента в речника на данните
select DEGREE from user_indexes where table_name = 'TAB_HIST';
DEGREE
---------
2
Имайте предвид, че след създаване на индекс в паралелен режим често искате да нулирате DOP на едно. В противен случай някои прости заявки за вложен цикъл може да бъдат объркани и да отворят паралелна заявка...