2014-11-13 41 views
6

Tôi có gợi ý PARALLEL (a, 8) trong truy vấn hợp nhất. Máy chủ của tôi có 4 cpu với oracle 11.2.0.3.0 - 64bitTại sao các phiên song song được tạo ngay cả khi tôi tắt DML song song và DDL song song

Trong khi thực hiện sáp nhập truy vấn tôi tàn tật vĩ tuyến DDL và DML -in v $ session 8 phiên đã tạo.

Khi thực hiện truy vấn hợp nhất I bật DDL song song và DML -in v $ phiên phiên 16 đã được tạo.

Tại sao điều này lại xảy ra? Có lời giải thích nào về điều này không?

Ngoài ra, tôi nhận thấy rằng nếu DDL song song và DML được kích hoạt

  • cho PARALLEL (a, 2): Tổng 4 phiên được tạo ra
  • cho PARALLEL (a, 4): Tổng 8 phiên được tạo ra
  • cho PARALLEL (a, 8): tổng 16 phiên được tạo ra

    ALTER SESSION DISABLE PARALLEL QUERY;
    ALTER SESSION DISABLE PARALLEL DML;
    ALTER SESSION DISABLE PARALLEL DDL;

    MERGE/* + Parallel (a, 8) */BIGTABLE_1 một SỬ DỤNG BIGTABLE_2 b ON (a.KEY = b.KEY) khi xuất hiện sau đó cập nhật SET a.Value1 = b.value1;

Bên cạnh đó, trên tài liệu 10g Tôi đọc

Chế độ mặc định của một phiên là DISABLE PARALLEL DML. Khi song song DML bị tắt, sẽ không có DML nào được thực thi song song ngay cả khi gợi ý PARALLEL được sử dụng.

https://docs.oracle.com/cd/B19306_01/server.102/b14223/usingpe.htm#CACCBEJC

Cảm ơn trước

Trả lời

3

đọc và viết song song không phải lúc nào ràng buộc với nhau.

alter session disable parallel dml; chỉ vô hiệu hóa song song cho phần WRITE của câu lệnh. Phần READ có thể vẫn chạy song song. Vì đây là thao tác MERGE, gợi ý song song yêu cầu cả đọc và viết song song. Ngoài ra, một gợi ý song song ghi đè alter session disable parallel query;, mặc dù nó không ghi đè alter session disable parallel dml;.

Số lượng máy chủ song song sẽ gấp hai lần mức độ yêu cầu song song để hỗ trợ producer and consumer operations, nhằm tận dụng tối đa tính tương đương giữa các hoạt động. Các truy vấn nhóm hoặc đặt hàng các kết quả sẽ sử dụng gấp đôi số lượng chủ đề. Trong một số trường hợp, điều này có thể xảy ra ngay cả khi không có rõ ràng GROUP BY hoặc ORDER BY vì một số hoạt động có thể yêu cầu sắp xếp một cách ngầm định.

bảng mẫu

create table bigtable_1(key number, value1 number); 
create table bigtable_2(key number, value1 number); 

Parallel đọc và viết

Lưu ý PX COORDINATOR cho hoạt động # 1. Khi bước đó ở trên các MERGE nó có nghĩa là việc viết được thực hiện song song.

rollback; 
alter session enable parallel dml; 
alter session enable parallel query; 
explain plan for merge /*+ parallel(a,8) */ into bigtable_1 a using bigtable_2 b 
    on (a.key = b.key) when matched then update set a.value1 = b.value1; 
select * from table(dbms_xplan.display(format => 'basic')); 

Plan hash value: 827272579 

------------------------------------------------------ 
| Id | Operation      | Name  | 
------------------------------------------------------ 
| 0 | MERGE STATEMENT     |   | 
| 1 | PX COORDINATOR     |   | <-- PARALLEL WRITE 
| 2 | PX SEND QC (RANDOM)   | :TQ10003 | 
| 3 | MERGE      | BIGTABLE_1 | 
| 4 |  PX RECEIVE     |   | <-- PARALLEL READ 
| 5 |  PX SEND HYBRID (ROWID PKEY)| :TQ10002 | 
| 6 |  VIEW      |   | 
| 7 |  HASH JOIN BUFFERED  |   | 
| 8 |   BUFFER SORT    |   | 
| 9 |   PX RECEIVE    |   | 
| 10 |   PX SEND HASH   | :TQ10000 | 
| 11 |   TABLE ACCESS FULL | BIGTABLE_2 | 
| 12 |   PX RECEIVE    |   | 
| 13 |   PX SEND HASH   | :TQ10001 | 
| 14 |   PX BLOCK ITERATOR  |   | 
| 15 |   TABLE ACCESS FULL | BIGTABLE_1 | 
------------------------------------------------------ 

nối tiếp ghi, song song đọc

Bây giờ hoạt động MERGE là trên hết PX ... hoạt động. Việc ghi được thực hiện một cách serially, nhưng việc đọc vẫn được thực hiện song song.

rollback; 
alter session disable parallel dml; 
alter session disable parallel query; 
explain plan for merge /*+ parallel(a,8) */ into bigtable_1 a using bigtable_2 b 
    on (a.key = b.key) when matched then update set a.value1 = b.value1; 
select * from table(dbms_xplan.display(format => 'basic')); 

Plan hash value: 1648019208 

------------------------------------------------ 
| Id | Operation     | Name  | 
------------------------------------------------ 
| 0 | MERGE STATEMENT   |   | 
| 1 | MERGE     | BIGTABLE_1 | <-- SERIAL WRITE 
| 2 | PX COORDINATOR   |   | <-- PARALLEL READ 
| 3 | PX SEND QC (RANDOM) | :TQ10002 | 
| 4 |  VIEW     |   | 
| 5 |  HASH JOIN BUFFERED |   | 
| 6 |  BUFFER SORT   |   | 
| 7 |  PX RECEIVE   |   | 
| 8 |   PX SEND HASH  | :TQ10000 | 
| 9 |   TABLE ACCESS FULL| BIGTABLE_2 | 
| 10 |  PX RECEIVE   |   | 
| 11 |  PX SEND HASH  | :TQ10001 | 
| 12 |   PX BLOCK ITERATOR |   | 
| 13 |   TABLE ACCESS FULL| BIGTABLE_1 | 
------------------------------------------------ 
+0

Cảm ơn bạn đã trả lời tuyệt vời @jon Heller. – touchchandra

+0

Hơn nữa, Chỉ muốn rõ ràng trong một điều nữa. Cấu hình nào bạn đề nghị, case-1) vô hiệu hóa DML và sử dụng Parallel (a, 8) hoặc case-2) kích hoạt DML và sử dụng Parallel (a, 4). Chỉ để đảm bảo rằng tổng số phiên vẫn còn 8. – touchchandra

+1

Tôi khuyên bạn nên sử dụng '/ * + parallel (8) * /'. Điều đó sử dụng tính song song mức tuyên bố thay vì cấp đối tượng. Bằng cách đó bạn không phải lo lắng về việc chỉ định từng bí danh riêng biệt. Và tôi sẽ hướng tới DOP là 8, không phải một số máy chủ song song của 8. Số cuối cùng có thể kết thúc là 16, nhưng một nửa số chủ đề đó sẽ chỉ ngồi đó để nhận dữ liệu và không thực sự tất cả "đang hoạt động" tại cùng một lúc. –