Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

O Parallel Hint no Dynamic SQL do Oracle é executado em paralelo?


TLDR

Muito provavelmente você esqueceu de habilitar o DML paralelo.
ALTER SESSION ENABLE PARALLEL DML;

Além disso, se você forçar execução paralela que você normalmente não use dicas paralelas e vice versa.

Configuração de amostra (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;

Inserir

Você deve ativar DML paralelo no primeiro passo
ALTER SESSION ENABLE PARALLEL DML;

Observe que, alternativamente, uma dica pode ser usada
INSERT /*+ ENABLE_PARALLEL_DML */ …

Além disso, se você forçar DML e QUERY paralelos, você normalmente não usa dicas paralelas . Estou sugerindo uma inserção direta com APPEND que é frequentemente usado nesta situação.
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;
/

Como verificar se a tabela foi inserida em paralelo? A maneira mais simples é consultar a tabela (antes de fazer um commit) - se você receber o erro abaixo, é uma inserção direta paralela.
select count(*) from TAB_HIST;
ORA-12838: cannot read/modify an object after modifying it in parallel

Índice

Se você especificar um grau paralelo no create index declaração que você não precisa habilitar ou forçar nada.
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;
/

A verificação é tão simples quanto consultar o diploma no dicionário de dados
select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Observe que depois de criar o índice no modo paralelo, muitas vezes você deseja redefinir o DOP para um. Caso contrário, algumas consultas de loop aninhado simples podem ser confusas e abrirão uma consulta paralela...