sql >> Database teknologi >  >> RDS >> Oracle

Kører Parallel Hint i Dynamic SQL i Oracle parallelt?

TLDR

Du har sandsynligvis glemt at aktivere parallel DML.

ALTER SESSION ENABLE PARALLEL DML;

Yderligere, hvis du tvinger parallel udførelse du typisk ikke brug parallelle tip og omvendt.

Eksempelopsætning (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;

Indsæt

Du skal aktiver parallel DML i det første trin

ALTER SESSION ENABLE PARALLEL DML;

Bemærk, at der alternativt kan bruges et tip

INSERT /*+ ENABLE_PARALLEL_DML */ …

Derudover hvis du tvinger parallel DML og QUERY, bruger du typisk ikke parallelle hints . Jeg antyder en direkte indsættelse med APPEND som ofte bruges i denne situation.

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

Hvordan kontrollerer man, om tabellen blev indsat parallelt? Den enkleste måde er at forespørge i tabellen (inden du foretager en commit) - hvis du får fejlen nedenfor, er det en parallel direkte indsættelse.

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

Indeks

Hvis du angiver en parallelgrad i create index sætning, du ikke behøver aktivere eller tvinge noget.

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

Kontrollen er lige så enkel som at se på graden i dataordbog

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Bemærk, at efter at have oprettet indeks i parallel tilstand, ønsker du ofte at nulstille DOP til en. Ellers kan nogle simple indlejrede loop-forespørgsler blive forvirrede og vil åbne en parallel forespørgsel...



  1. Tilslutning til Amazon RDS-instans gennem EC2-instans ved hjælp af MySQL Workbench

  2. Sammenføj to borde med stand - rubin på skinner

  3. Hvordan implementerer man INSERT ON DUPLICATE KEY UPDATE aka upsert i CakePHP 3?

  4. Opretter udløser, som kaster en undtagelse ved indsættelse