并行(Parallel)操作特性,是Oracle为更充分利用服务器硬件处理资源,提高特定大数据量操作效率,应对海量生产数据而推出的一种技术特性。通常,我们进行的sql处理都是单进程操作,对应单个cpu操作单元。所谓的并行操作,就是在软硬件条件允许的情况下,Oracle调用多个处理单元分别进行处理,最后汇合结果的过程。对一些sql进行有计划的并行操作,可以显著提高系统操作速度。
1、海量数据的困局
互联网络时代给世界带来很多变化,其中一项就是信息的爆炸,数据呈几何级数增长。数据库随之进入海量、洋级时代,TB级数据库已经越来越频繁的出现在各类型应用场景中。开发人员和DBA就不得不面对一个困局,如果处理海量数据。
在传统时代,我们最常借助的一个优化手段是索引。通过检索较少的数据块,获取到符合条件的数据行rowid。“索引进入执行计划,替代全表扫描”成为我们优化的重要导向。但是,索引路径不是用户最终体验。随着数据量的增大(单表上G),即使我们的执行计划很完美,检索索引+数据块定位的时间损耗可能依然不能满足客户需求。其次,一些特定系统类型(如OLAP系统),可能就是要进行全表扫描操作,对所有数据进行检索处理。这些场合下,传统的索引中心优化就无用武之地了。
在计算机科学中,“分治”这种古老的思想一直扮演着重要地位,无论是在软件的算法还是在硬件的体系。近年来,硬件技术,特别是多核cpu、多cpu计算机的逐渐普及,使得多核计算机、服务器开始出现在企业应用领域。多核cpu和多cpu本质上就是多处理单元并行的基础。将一个任务划分为若干个子任务,交由不同的处理单元进行同时处理,之后将结果集合汇总,是通用的单任务多处理进程模型。应该说,并行技术是建立在软硬件技术基础之上的,其中硬件技术是一个决定要素。
2、Oracle的并行处理
Oracle并行处理(Parallel Processing)特性主要是针对sql语句处理的并行。目前Oracle提供支持并行的操作包括如下类型:
ü并行查询操作;
ü并行DDL。对数据对象的DDL操作;
ü并行DML。进行并行的数据更新修改;
在具体的应用场景上,有如下场景:
ü数据表、索引范围扫描的查询;
ü数据表、索引对象的创建;
ü“DBMS_STATS”收集统计量;
ü备份恢复管理器Recovery Manager的使用;
在Oracle中,一共包括三种进程Process类型,分别为客户进程Client Process、服务进程Server Process和后台进程Background Process。其中,进行数据块读取、修改写入等实际操作的都是服务进程Server Process。Server Process是客户进程在数据库实例上的代理进程,保持着一对一的关系。由此,一般的sql语句都是单进程串行操作的。
Oracle并行操作涉及的过程同一般并行操作的模型基本相似,包括处理单元和协调单元两类进程组成。首先,处理的单一任务划分为若干子任务。在协调进程(Coordinator)的作用下,并行操作被划分为若干子任务,分别传递给多个并行服务进程进行处理。之后,各个进程将处理结果进行汇总,交付给协调进程进行组合,作为统一的结果返回。
并处处理在Oracle中是一个配置过程,包括很多参数配置和概念要素。其中最重要的两个概念就是并行度和并行伺候进程池。下面分别来介绍两个概念和相关的配置项目。
3、并行度和并行伺候进程池
并行度DOP(Degree Of Parallel)定义了进行并行操作时并行流的个数。DOP可以理解成进行并行处理时候,划分的并行处理单元个数。但是,在实际的情况看,进行并行处理的进程个数往往是DOP的两倍,也就是一个并行流实际上是两个处理进程在进行处理工作。这样的配置通常是为了实现进程之间的协调合作,缓解各个处理环节上的速度不匹配现象。
并行度DOP是Oracle并行操作中一个重要的配置参数。目前的Oracle版本中,支持手工配置和自动配置DOP两种方式。如果是手工指定并行度,就需要在sql语句上,通过hint来制定并行度的个数。自动配置DOP的含义是Oracle根据当前实际负载和并行进程池的状况,经过计算自动的出的适应性并行度。下面是一些Oracle中与并行度相关的参数。
sql> show parameter parallel
NAMETYPEVALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollbackstringLOW
parallel_adaptive_multi_userbooleanTRUE
parallel_automatic_tuningbooleanFALSE
parallel_degree_limitstringcpu
parallel_degree_policystringMANUAL
parallel_execution_message_sizeinteger16384
parallel_force_localbooleanFALSE
parallel_instance_groupstring
parallel_io_cap_enabledbooleanFALSE
parallel_max_serversinteger10
parallel_min_percentinteger0
parallel_min_serversinteger0
parallel_min_time_thresholdstringAUTO
parallel_serverbooleanFALSE
parallel_server_instancesinteger1
parallel_servers_targetinteger4
parallel_threads_per_cpuinteger2
recovery_parallelisminteger0
上面参数的含义,会在本系列中逐渐使用和介绍。
DOP是一个配置项目,实际的并行工作还需要真是存在的进程完成。从上文的背景介绍中,一个session只对应一个Server Process,进行操作处理实际都需要Server Process来完成。并行处理中,Oracle引入了并行伺候进程池的概念。并行伺候进程池是一个进程的集合,针对需要进行并行处理的sql操作,会从处理池中分配出适当数量的服务进程来进行处理。
一些与并行服务进程相关的参数,如下:
sql> show parameter parallel_m
4、一个并行Query的示例
下面针对一个大数据量表,演示一下并行sql的执行计划。首先还是环境准备:
sql> select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
sql> select count(*) from t;
COUNT(*)
----------
1110542
使用并行操作,最常用的方式是通过Hint进行指定(当然也可以通过对象Parallel属性指定)。下面是没有使用并行和使用并行两个执行计划的差异演示。
sql> set linesize 10000;
sql> set pagesize 10000;
sql>explain plan for select * from t;
已解释。
已用时间:00: 00: 00.03
sql> select * from table(dbms_xplan.display(format => 'advanced'));
PLAN_TABLE_OUTPUT
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id| Operation| Name | Rows| Bytes | Cost (%cpu)| Time|
|0 | SELECT STATEMENT||1156K|106M|4464(1)| 00:00:54 |
|1 |TABLE ACCESS FULL| T|1156K|106M|4464(1)| 00:00:54 |
(篇幅原因,有删节…)
针对一般的SQL查询,是不使用Parallel Query特性的。下面针对Hint使用:
sql>explain plan for select /*+ parallel */ * from t;
已用时间:00: 00: 00.06
----------------------------------------------------------------------------------------------------
Plan hash value: 3050126167
| Id| Operation| Name| Rows| Bytes | Cost (%cpu)| Time|TQ|IN-OUT| PQ Distrib |
|0 | SELECT STATEMENT||1156K|106M|2478(1)| 00:00:30 ||||
|1 |PX COORDINATOR|||||||||
|2 |PX SEND QC (RANDOM)| :TQ10000 |1156K|106M|2478(1)| 00:00:30 |Q1,00 | P->S | QC
|3 |PX BLOCK ITERATOR ||1156K|106M|2478(1)| 00:00:30 |Q1,00 | PCWC ||
|4 |TABLE ACCESS FULL| T|1156K|106M|2478(1)| 00:00:30 |Q1,00 | PCWP ||
Automatic Degree of Parallelism Information:
--------------------------------------------
- Degree of Parallelism of 2 is derived from scan of object SYS.T
Note
-----
-automatic DOP: Computed Degree of Parallelism is 2
上面的执行计划,可以看出将全表扫描分割为多个DOP进行处理,之后汇总到协调者进程中,返回结果。
同时,使用parallel的hint后,没有显示指定出并行度。Oracle采用自动并行度方式,采用2作为并行度。
最后,时间使用上。估算出的执行计划只需要使用30s,而之前的串行计划则需要接近一分钟时间。
5、谨慎处理并行
最后,想谈谈并行的一些使用注意原则。
ü慎用并行。并行处理使用的目的是在提高系统软硬件资源使用率,从而提高sql执行效率。但是,并不是所有sql使用并行都可以提高性能。同索引一样,使用并行也是有成本付出的,这就是多进程之间启动和协调成本。通常,只有在处理超大规模数据、而且没有其他常规优化方法,并且证明并行可以带来提升的情况下,才考虑使用并行;
ü统一并行。同其他优化方案一样,并行是否使用,哪个sql使用并行,并行度取值多少。这些问题不是单个模块和开发人员可以确定的,需要系统整体考虑。如果说索引消耗的是空间和处理资源的话,并行额外付出是处理cpu协调成本。这些优化方法最好有统一的优化方案全局考量和跟踪,决不能各行其是,引起性能新问题;
ü确定并行。并行处理是需要各种参数进行配合使用的,我们希望使用并行,就要保证实际执行的语句确实在进行并行处理。这要通过不断的跟踪执行计划和处理过程来实现。
Oracle Parallel特性是一柄双刃剑,要小心仔细对待。