Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Apakah Petunjuk Paralel dalam SQL Dinamis Oracle berjalan secara paralel?

TLDR

Kemungkinan besar Anda lupa mengaktifkan DML paralel.

ALTER SESSION ENABLE PARALLEL DML;

Selain itu jika Anda memaksa eksekusi paralel yang biasanya tidak gunakan petunjuk yang paralel dan sebaliknya.

Contoh Penyiapan (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;

Sisipkan

Anda harus mengaktifkan DML paralel pada langkah pertama

ALTER SESSION ENABLE PARALLEL DML;

Perhatikan bahwa sebagai alternatif, petunjuk dapat digunakan

INSERT /*+ ENABLE_PARALLEL_DML */ …

Selain itu jika Anda memaksa DML dan QUERY paralel, Anda biasanya tidak menggunakan petunjuk paralel . Saya mengisyaratkan penyisipan langsung dengan APPEND yang sering digunakan dalam situasi ini.

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

Bagaimana cara memeriksa apakah tabel dimasukkan secara paralel? Cara paling sederhana adalah dengan menanyakan tabel (sebelum membuat komit) - jika Anda mendapatkan kesalahan di bawah, itu cara menyisipkan langsung secara paralel.

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

Indeks

Jika Anda menentukan derajat paralel di create index pernyataan yang tidak perlu Anda aktifkan atau memaksa apa saja.

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

Pengecekannya semudah melihat gelar di kamus data

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

Perhatikan bahwa setelah membuat indeks dalam mode paralel, Anda sering ingin mengatur ulang DOP menjadi satu. Jika tidak, beberapa kueri loop bersarang sederhana mungkin membingungkan dan akan membuka kueri paralel...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL secara otomatis membuat PK VARCHAR yang bertambah

  2. Musim semi JdbcTemplate mengubah sesi

  3. bagaimana cara memasukkan tanggal dan waktu di oracle?

  4. Kelompokkan baris berdasarkan nilai jumlah kolom

  5. Apakah urutan pelarian dipertahankan dalam CLOB?