sql >> Databáze >  >> RDS >> Oracle

Běží Parallel Hint v rámci Dynamic SQL of Oracle paralelně?

TLDR

Pravděpodobně jste zapomněli povolit paralelní DML.

ALTER SESSION ENABLE PARALLEL DML;

Navíc, pokud vynutíte paralelní provádění, které obvykle neděláte použijte paralelní nápovědy a naopak.

Ukázkové nastavení (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;

Vložit

Musíte povolit paralelní DML v prvním kroku

ALTER SESSION ENABLE PARALLEL DML;

Všimněte si, že alternativně lze použít nápovědu

INSERT /*+ ENABLE_PARALLEL_DML */ …

Navíc pokud vynutíte paralelní DML a QUERY, obvykle nepoužíváte paralelní tipy . Tipuji přímé vložení pomocí APPEND který se v této situaci často používá.

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

Jak zkontrolovat, zda byla tabulka vložena paralelně? Nejjednodušším způsobem je dotaz na tabulku (před provedením odevzdání) - pokud se zobrazí níže uvedená chyba, je to paralelní přímé vložení.

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

Index

Pokud zadáte paralelní stupeň v create index prohlášení, které nemusíte povolovat nebo vynutit cokoliv.

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

Kontrola je stejně jednoduchá jako pohled na stupeň v datovém slovníku

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Všimněte si, že po vytvoření indexu v paralelním režimu často chcete resetovat DOP na jednu. Jinak mohou být některé jednoduché dotazy vnořené smyčky zmatené a otevřou paralelní dotaz...



  1. Západka APPEND_ONLY_STORAGE_INSERT_POINT

  2. Jak omezíte skupinu podle řádků v dotazu mysql?

  3. regex, abyste našli a vyhnuli se dvojitým tečkám v Oracle

  4. psycopg2 :kurzor je již uzavřen