Oracle 11g 並行DML

轉自: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章