Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy Parallel Hint w ramach Dynamic SQL firmy Oracle działa równolegle?

TLDR

Najprawdopodobniej zapomniałeś włączyć równoległy DML.

ALTER SESSION ENABLE PARALLEL DML;

Dodatkowo, jeśli wymusisz wykonywanie równoległe, których zazwyczaj nie używaj równoległych wskazówek i odwrotnie.

Przykładowa konfiguracja (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;

Wstaw

Musisz włącz równoległy DML w pierwszym kroku

ALTER SESSION ENABLE PARALLEL DML;

Pamiętaj, że alternatywnie można użyć podpowiedzi

INSERT /*+ ENABLE_PARALLEL_DML */ …

Dodatkowo, jeśli wymusisz równoległe DML i QUERY, zazwyczaj nie używasz równoległych wskazówek . Sugeruję bezpośrednią wstawkę za pomocą APPEND który jest często używany w takiej sytuacji.

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 sprawdzić, czy tabela została wstawiona równolegle? Najprostszym sposobem jest wykonanie zapytania do tabeli (przed dokonaniem zatwierdzenia) - jeśli pojawi się poniższy błąd, oznacza to bezpośrednie wstawienie równoległe.

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

Indeks

Jeśli określisz stopień równoległy w create index oświadczenie, którego nie potrzebujesz włączać lub wymuszać cokolwiek.

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

Sprawdzenie jest tak proste, jak sprawdzenie stopnia w słowniku danych

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Zauważ, że po utworzeniu indeksu w trybie równoległym często chcesz zresetować DOP do jednego. W przeciwnym razie niektóre proste zapytania z pętlą zagnieżdżoną mogą zostać pomylone i otworzą zapytanie równoległe...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Groovy Oracle Stored Proc — nieprawidłowy indeks kolumny

  2. Funkcja tabeli z gromadzeniem zbiorczym wyrzuca nieprawidłowy typ danych

  3. Dlaczego sqlplus nie łączy się?

  4. Jak zadeklarować i wyświetlić zmienną w Oracle

  5. Wykonaj funkcję Oracle, która zwraca kursor referencyjny w C#