sql >> Databasteknik >  >> RDS >> Oracle

Körs Parallel Hint inom Dynamic SQL i Oracle parallellt?

TLDR

Troligtvis har du glömt att aktivera parallell DML.

ALTER SESSION ENABLE PARALLEL DML;

Dessutom om du tvingar parallell exekvering du vanligtvis inte använd parallella tips och vice versa.

Exempel på inställningar (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;

Infoga

Du måste aktivera parallell DML i det första steget

ALTER SESSION ENABLE PARALLEL DML;

Observera att ett tips alternativt kan användas

INSERT /*+ ENABLE_PARALLEL_DML */ …

Dessutom om du tvingar parallell DML och QUERY använder du vanligtvis inte parallella tips . Jag antyder en direkt infogning med APPEND som ofta används i den här situationen.

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

Hur kontrollerar man om tabellen infogades parallellt? Det enklaste sättet är att fråga tabellen (innan du gör en commit) - om du får felmeddelandet i bälgen blir det en parallell direkt infogning.

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

Index

Om du anger en parallellgrad i create index uttalande du inte behöver aktivera eller tvinga vad som helst.

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 är lika enkel som att titta på graden i datadictionary

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Observera att efter att ha skapat index i parallellt läge vill du ofta återställa DOP till ett. Annars kan vissa enkla kapslade loop-frågor förväxlas och öppnar en parallell fråga...



  1. Ta bort dubbletter av rader (baserat på värden från flera kolumner) från SQL-tabellen

  2. Hur gör man en kapslad fråga?

  3. Dubblett inmatning för nyckeln 'group_key'

  4. flera förfrågningar till node express mysql-synkroniseringsproblem