并行的实现机制是: 首先,Oracle 会创建一个进程用于协调并行服务进程之间的信息传递,这个协调进程将需要操作的数据集(比如表的数据块)分割成很多部分,称为并行处理单元,然后并行协调进程给每个并行进程分配一个数据单元。比如有四个并行服务进程,他们就会同时处理各自分配的单元,当一个并行服务进程处理完毕后,协调进程就会给它们分配另外的单元,如此反复,直到表上的数据都处理完毕,最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果,返回给用户。
这种数据并行处理方式在OLAP系统中非常有用,OLAP系统的表通常来说都是非常大,如果系统的CPU比较多,让所有的CPU共同来处理这些数据,效果就会比串行执行要高的多。然而对于OLTP系统,通常来讲,并行并不合适,原因是OLTP系统上几乎在所有的SQL操作中,数据访问路劲基本上以索引访问为主,并且返回结果集非常小,这样的SQL 操作的处理速度一般非常快,不需要启用并行。
并行查询
并行查询允许将一个SQL select 语句划分为多个较小的查询,每个部分的查询并发的运行,然后将各个部分的结果组合起来,提供最终的答案。
并行查询需要保证两个前提,第一,需要执行一个大任务,这说明,并行查询不能作为典型OLTP系统的解决方案,因为在OLTP系统中,不会执行长时间运行的任务,这些系统上启用并行执行通常是灾难性的;第二,需要有充足的空闲资源。
一个查询能够并行执行,需要满足一下条件:
SQL语句中有Hint提示,比如Parallel 或者 Parallel_index.
SQL语句中引用的对象被设置了并行属性。
多表关联中,至少有一个表执行全表扫描(Full table scan)或者跨分区的Index range SCAN。
如: select /*+parallel(t 4) * from t;
注意:并行执行更应该算是一个DBA工具,而不是一个并行查询工具
并行DML
需要显式的启用PDML
alter session enable parallel dml;
由于PDML采用的是一种伪分部的实现,因此存在一些限制:
1、PDML操作期间不支持触发器
2、PDML期间,不支持某些声明方式的引用完整性约束,因为表中的每一部分会在单独的会话中作为单独的事物进行修改。
3、在提交或回滚之前,不能访问用PDML修改的表
4、PDML不支持高级复制(高级复制特性的实现要基于触发器)
5、不支持延迟约束
6、如果表是分区的,PDML只可能在有位图索引或LOB列的表上执行,并且并行度取决于分区数。在这种情况下,无法在分区内并行执行一个操作,因为每个分区只有一个并行执行服务器来处理。
7、执行PDML时不支持分布式事务
8、PDML不支持聚簇表
并行DDL
以下SQL DDL命令允许并行化
1、create index,多个并行执行服务器可以扫描表、对数据排序,并把有序的段写出到索引结构
2、create table as select,执行select的查询可以使用并行查询来执行,表加载本身可以并行完成
3、alter index rebuild,索引结构可以并行重建
4、alter table move,表可以并行移动(可以并行move一个表的单个分区)
以上4个命令也适用于单个的表/索引分区
5、alter table split|coalesce partition:单个表分区可以并行的分解或合并
6、alter index split partition,索引分区可以并行的分解
注意,采用并行DDL与外部表加载数据时,尽量采用区段截断,uniform本地管理表空间不支持区段截断,autoallocate本地管理表空间支持区段截断,即加载数据的表使用autoallocate属性的表空间
create tablespace tbs datafile '/u01/app/....../tbs.dbf' size 100m reuse
autoextend on next 100m
extent management local
autoallocate(uniform size 100m);
过程并行化
并行管道函数(parallel pipelined function)
DIY并行化,是指在你自己的应用上使用oracle执行并行全表扫描所采用的技术
并行度可以通过以下三种方式来设定:
使用Hint 指定并行度。
使用alter session force parallel 设定并行度。
使用SQL中引用的表或者索引上设定的并行度,原则上Oracle 使用这些对象中并行度最高的那个值作为当前执行的并行度。
示例:
SQL>Select /*+parallel(t 4) */ count(*) from t;
SQL>Alter table t parallel 4;
SQL>Alter session force parallel query parallel 4;
并行度的优先级别从高到低:
Hint->alter session force parallel->表,索引上的设定-> 系统参数
实际上,并行只有才系统资源比较充足的情况下,才会取得很好的性能,如果系统负担很重,不恰当的设置并行,反而会使性能大幅下降。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29337971/viewspace-1068677/
,如需转载,请注明出处,否则将追究法律责任。