oracle 11g 并行DML

来源:互联网 发布:苹果手机好在哪里知乎 编辑:程序博客网 时间:2024/06/03 19:27

oracle11g 并行DML(PDML)

并行DML应用在决策支撑系统(decision support system   DSS)环境时,对于访问大对象时,可扩展性和性能有灰常显著的效果。

不能把PDML当成提高OLTP应用速度的一个特性。PDML在大型数据仓库中很有用,它利于大量的数据批量更新。

并行 DML ,指包含 (并行 INSERT, UPDATE, DELETE, and MERGE )来提高在大数据对象上加载数据或者更新的速度。 尽管DML还包含SELECT 查询,但是此时并行DML,仅仅指并行 INSERT,UPDATE,DELETE, and MERGE。并行查询与PDML有所不同


Decision to Parallelize--开启并行DML

PDML有别于并行查询,除非显示的请求PDML ,否则不能执行PDML。

SQL> alter session enable parallel dml;

Session altered.

这个表属性可能是并行的,但是与并行查询不同,这对于PDML还不够,必须显示的在会话中启动PDML.

假如当SESSION 的parallel dml属性为DISABLE,那么就算你指定了parallel的hint提示无效。因此,使用PDML,必须是session enable  paralle DML;


Degree of Parallelism  --并行度

1、通过在DML语句中加hint指定并行度 /*+ parallel (4)*/

2、对象表有并行度的指定

3、ALTER SESSION FORCE PARALLELDML 限制语句。

注意:在insert ...select时,可以分别为insert和select用hint指定并行度

SQL> create table test_f as select * from dba_objects where 1=2;Table created.SQL> SQL> SQL> alter session enable parallel dml;Session altered.SQL> insert /*+ parallel(4) */  into test_f select /*+ parallel(6) */ * from dba_objects;75302 rows created.


PDML 采用的是一种伪分布式的实现,存在一些限制

1、PDML期间不支持触发器。在有触发器的表上,不支持PDML

2、PDML期间,不支持某些方式声明的引用完整性。因为表中的每个部分会在单独的会话中作为单独的事务进行处理。PDML操作不支持自引用完整性,那样可能会出现死锁

3、提交或回滚之前,不能访问用PDML修改的表。

4、不支持延迟约束

5、如果表示分区的,PDML只可能有位图索引或LOB列的表上执行。而且并行度取决于分区数。无法在子分区内再并行操作,因为每一个分区只有一个并行执行服务器来处理

6、执行PDML时,不支持分布式事务

7、PDML不支持聚簇表

8、并行UPDATE, DELETE, and MERGE不支持temporary table


测试:

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


数据完整性限制

允许表上的not null 、check、unique、primary key

对于外键(foreign key),则有一些限制。

当一个操作引发对另一个表的操作。

Referential Integrity RestrictionsDML StatementIssued on ParentIssued on ChildSelf-Referential

INSERT

(Not applicable)

Not parallelized

Not parallelized

MERGE

(Not applicable)

Not parallelized

Not parallelized

UPDATE No Action

Supported

Supported

Not parallelized

DELETE No Action

Supported

Supported

Not parallelized

DELETE Cascade

Not parallelized

(Not applicable)

Not parallelized

Delete Cascade  --级联删除

Deletion on tables having a foreign key with delete cascade is not parallelized because parallel execution servers attempt to delete rows from multiple partitions (parent and child tables).


Self-Referential Integrity  ---自引用完整性约束

DML on tables with self-referential integrity constraints is not parallelized if the referenced keys (primary keys) are involved. For DML on all other columns, parallelism is possible.

Deferrable Integrity Constraints

If any deferrable constraints apply to the table being operated on, the DML operation is not executed in parallel.


Trigger Restrictions  ---触发器限制

 DML operation is not executed in parallel if the affected tables contain enabled triggers that may get invoked as a result of the statement. This implies that DML statements on tables that are being replicated are not parallelized.

Relevant triggers must be disabled to parallelize DML on the table. Note that, if you enable or disable triggers, the dependent shared cursors are invalidated.


Distributed Transaction Restrictions  --分布式事务

A DML operation cannot be executed in parallel if it is in a distributed transaction or if the DML or the query operation is on a remote object.



总结:

PDML需要显示打开,只有打开了PDML , 才能是真正意义上的并发操作.

SQL> alter session enable parallel dml;

执行完可以关闭

SQL> alter session disable parallel dml;

原创粉丝点击