sql >> Base de Datos >  >> RDS >> Oracle

¿Parallel Hint dentro de SQL dinámico de Oracle se ejecuta en paralelo?

TLDR

Lo más probable es que haya olvidado habilitar DML paralelo.

ALTER SESSION ENABLE PARALLEL DML;

Además, si fuerza ejecución paralela que normalmente no usar sugerencias paralelas y viceversa.

Configuración de muestra (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;

Insertar

Debe habilitar DML paralelo en el primer paso

ALTER SESSION ENABLE PARALLEL DML;

Tenga en cuenta que, alternativamente, se puede usar una pista

INSERT /*+ ENABLE_PARALLEL_DML */ …

Además, si fuerza DML paralelo y QUERY, normalmente no usa sugerencias paralelas . Estoy insinuando una inserción directa con APPEND que se usa a menudo en esta situación.

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;
/

¿Cómo verificar si la tabla se insertó en paralelo? La forma más sencilla es consultar la tabla (antes de realizar una confirmación); si recibe el siguiente error, se trata de una inserción directa en paralelo.

select count(*) from TAB_HIST;
ORA-12838: cannot read/modify an object after modifying it in parallel

Índice

Si especifica un título paralelo en el create index declaración que no necesita habilitar o forzar cualquier cosa.

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;
/

La comprobación es tan sencilla como mirar el grado en el diccionario de datos

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Tenga en cuenta que después de crear un índice en modo paralelo, a menudo querrá restablecer el DOP a uno. De lo contrario, algunas consultas simples de bucle anidado pueden confundirse y abrir una consulta paralela...