sql >> Database >  >> RDS >> Oracle

Werkt Parallel Hint binnen Dynamic SQL van Oracle parallel?

TLDR

Waarschijnlijk bent u vergeten parallelle DML in te schakelen.

ALTER SESSION ENABLE PARALLEL DML;

Bovendien als je force parallelle uitvoering die u normaal gesproken niet gebruik parallelle hints en vice versa.

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

Invoegen

U moet parallelle DML inschakelen in de eerste stap

ALTER SESSION ENABLE PARALLEL DML;

Merk op dat als alternatief een hint kan worden gebruikt

INSERT /*+ ENABLE_PARALLEL_DML */ …

Bovendien, als u forceert parallelle DML en QUERY, u gebruikt meestal geen parallelle hints . Ik hint naar een directe invoeging met APPEND dat wordt vaak gebruikt in deze situatie.

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

Hoe controleer je of de tabel parallel is ingevoegd? De eenvoudigste manier is om de tabel op te vragen (voordat je een commit doet) - als je de balgfout krijgt, is het een manier om een ​​parallelle directe insertie te maken.

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

Index

Als u een parallelle graad opgeeft in de create index verklaring die u niet inschakelt of forceren 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;
/

De controle is zo eenvoudig als kijken naar de graad in datadictionary

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Merk op dat na het maken van een index in parallelle modus je vaak de DOP wilt resetten naar één. Anders kunnen sommige eenvoudige geneste lus-query's in de war raken en een parallelle query openen...



  1. Hoe kan ik mijn MySQL-gebruikersnaam en -wachtwoord opvragen?

  2. node.js mysql pool beginTransactie en verbinding

  3. Docker-compose controleren of mysql-verbinding gereed is

  4. Snel gegevens importeren naar mysql in Java