Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Läuft Parallel Hint in Dynamic SQL von Oracle parallel?

TLDR

Höchstwahrscheinlich haben Sie vergessen, paralleles DML zu aktivieren.

ALTER SESSION ENABLE PARALLEL DML;

Zusätzlich, wenn Sie erzwingen parallele Ausführung, die Sie normalerweise nicht ausführen Verwenden Sie parallele Hinweise und umgekehrt.

Beispieleinrichtung (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;

Einfügen

Sie müssen paralleles DML aktivieren im ersten Schritt

ALTER SESSION ENABLE PARALLEL DML;

Beachten Sie, dass alternativ ein Hinweis verwendet werden kann

INSERT /*+ ENABLE_PARALLEL_DML */ …

Zusätzlich, wenn Sie erzwingen paralleles DML und QUERY verwenden Sie normalerweise keine parallelen Hinweise . Ich weise auf eine direkte Einfügung mit APPEND hin das wird in dieser Situation oft verwendet.

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

Wie überprüfe ich, ob die Tabelle parallel eingefügt wurde? Der einfachste Weg ist, die Tabelle abzufragen (bevor ein Commit durchgeführt wird) - wenn Sie den folgenden Fehler erhalten, handelt es sich um eine parallele direkte Einfügung.

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

Index

Wenn Sie im create index einen parallelen Abschluss angeben -Anweisung müssen Sie nicht aktivieren oder erzwingen alles.

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

Die Überprüfung ist so einfach wie das Ansehen des Abschlusses im Data Dictionary

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Beachten Sie, dass Sie nach dem Erstellen des Indexes im parallelen Modus oft den DOP auf eins zurücksetzen möchten. Andernfalls könnten einige einfache Nested-Loop-Abfragen verwirrt werden und eine parallele Abfrage öffnen ...