轉自:http://www.linuxidc.com/Linux/2013-08/88608.htm
Oracle 11g 並行DML(PDML)
並行DML應用在決策支撐系統(decision support system DSS)環境時,對於訪問大對象時,可擴展性和性能有灰常顯著的效果。
不能把PDML當成提高OLTP應用速度的一個特性。PDML在大型數據倉庫中很有用,它利於大量的數據批量更新。
開啓PDML
PDML有別於並行查詢,除非顯示的請求PDML ,否則不能執行PDML。
SQL> alter session enable parallel dml;
Session altered.
這個表屬性可能是並行的,但是與並行查詢不同,這對於PDML還不夠,必須顯示的在會話中啓動PDML.
PDML 採用的是一種僞分佈式的實現,存在一些限制
1、PDML期間不支持觸發器
2、PDML期間,不支持某些方式聲明的引用完整性。因爲表中的每個部分會在單獨的會話中作爲單獨的事務進行處理。PDML操作不支持自引用完整性,那樣可能會出現死鎖
3、提交或回滾之前,不能訪問用PDML修改的表。
4、不支持延遲約束
5、如果表示分區的,PDML只可能有位圖索引或LOB列的表上執行。而且並行度取決於分區數。無法在子分區內再並行操作,因爲每一個分區只有一個並行執行服務器來處理
6、執行PDML時,不支持分佈式事務
7、PDML不支持聚簇表
測試:
SQL> alter session disable parallel dml;
SQL> explain plan for update /*+ PARALLEL(4) */ test_b set object_name='AAAA';
SQL> select * from table(dbms_xplan.display);
Plan hash value: 725367477
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 75339 | 1839K| 81 (0)| 00:00:01 | | | |
| 1 | UPDATE | TEST_B | | | | | | | |
| 2 | PX COORDINATOR | | | | | | | | |
| 3 | PX SEND QC (RANDOM)| :TQ10000 | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 4 | PX BLOCK ITERATOR | | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL| TEST_B | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,00 | PCWP | |
---------------------------------------------------------------------------------------------------------------------------------------
--發現並沒有真正的實現並行.
開啓PDML
SQL> alter session enable parallel dml;
Session altered.
SQL> explain plan for update /*+ parallel(4) */ test_b set object_name='BBBBB';
Explained.
SQL> select * from table(dbms_xplan.display);
Plan hash value: 2467161980
------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 75339 | 1839K| 81 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10001 | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,01 | P->S | QC (RAND) |
| 3 | INDEX MAINTENANCE | TEST_B | | | | | Q1,01 | PCWP | |
| 4 | PX RECEIVE | | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,01 | PCWP | |
| 5 | PX SEND RANGE | :TQ10000 | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,00 | P->P | RANGE |
| 6 | UPDATE | TEST_B | | | | | Q1,00 | PCWP | |
| 7 | PX BLOCK ITERATOR | | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,00 | PCWC | |
| 8 | TABLE ACCESS FULL| TEST_B | 75339 | 1839K| 81 (0)| 00:00:01 | Q1,00 | PCWP | |
------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------
注:在併發INSERT的時候,數據是被使用APPEND方式插入到表中,如果需要常規方式插入,需要加上noappend提示.
總結:
PDML需要顯示打開,只有打開了PDML , 才能是真正意義上的併發操作.
SQL> alter session enable parallel dml;
執行完可以關閉
SQL> alter session disable parallel dml;
相關閱讀:
Oracle DML流程 http://www.linuxidc.com/Linux/2012-02/52972.htm
PL/SQL“ ORA-14551: 無法在查詢中執行 DML 操作”解決 http://www.linuxidc.com/Linux/2013-06/86713.htm
MySQL常用DDL、DML、DCL語言整理(附樣例) http://www.linuxidc.com/Linux/2013-06/86431.htm
Oracle基本事務和ForAll執行批量DML練習 http://www.linuxidc.com/Linux/2011-08/39836.htm
Oracle DML語句(insert,update,delete) 回滾開銷估算 http://www.linuxidc.com/Linux/2011-09/43287.htm