Oracle
 sql >> база данни >  >> RDS >> Oracle

Parallel Hint в Dynamic SQL на Oracle изпълнява ли се паралелно?

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 на едно. В противен случай някои прости заявки за вложен цикъл може да бъдат объркани и да отворят паралелна заявка...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да промените отрицателната стойност на положителна в Oracle?

  2. Вложена функция PIPELINED

  3. Леко приключение за покупка

  4. Oracle PL/SQL Създаване на таблици в курсора?

  5. Разделете голям текстов/CSV файл на множество файлове в PL SQL