并行查询
打开与关闭并行查询
alter table table_name parallel;
or
alter table table_name noparallel;
alter table table_name parallel 4; 这条语句是告诉
oracle ,在创建这个表的执行计划时使用并行度4
大多时候我们无法确定查询的并行度,需要根据当前的
服务器资源。
所以大部分时候都会用
alter table table_name parallel;
我们可以看看执行计划
表 FIANCEITEMDATA
select * from fianceitemdata
执行计划如下,执行的是全表扫描
SELECT STATEMENT, GOAL = ALL_ROWS116513440129568220
TABLE ACCESS FULLGUOYUANUSERFIANCEITEMDATA116513440129568220
执行
alter table fianceitemdata parallel;
SELECT STATEMENT, GOAL = ALL_ROWS 323 134401 29568220
PX COORDINATOR
PX SEND QC (RANDOM) SYS :TQ10000 323 134401 29568220
PX BLOCK ITERATOR 323 134401 29568220
TABLE ACCESS FULL GUOYUANUSER FIANCEITEMDATA32313440129568220
cost 由1165下降到323
我们从最后一行向上解读一下这个执行计划
最后一行执行了全表扫描
倒数第二行,全表扫描被分解成多个较小的扫描
倒数第三行,倒数第二行 将所有子结果传送给并行查询协调器
这个执行计划有点简单,闲麻烦用pl/sql developer生成的,大家可以用sqlplus看的更清楚一些。
并行DML(PDML)
oracle 将PDML范围限定为insert update delete merge 并不包括select
PDML有别于并行查询,
当一个表是并行的并不够,与并行查询不同,PDML还必须要在会话中启用
alter session enable parallel dml;
PDML采用的是一种伪分布式的实现,存在一些限制
1, PDML操作期间不支持触发器
2, PDML期间,不支持某些申明方式的引用的完整性约束。(都分成N块了让人家怎么去支持)
3, 在提交或回滚前,不能访问PDML修改的表。 全锁了
4, PDML不支持延迟约束
5, 不支持高级复制(高级复制特性的实现要基于触发器)
6, 如果表是分区的,PDML只可能在有位图索引或者LOB列的表上执行,而且并行度取决于分区数
7, 执行PDML时不支持分布式事务。
8, PDML不支持聚簇表。
如果违反了任何一个限制,语句会串行执行或者是产生一个错误。