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...