Oracle并行操作——从串行到并行

前端之家收集整理的这篇文章主要介绍了Oracle并行操作——从串行到并行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

并行(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特性是一柄双刃剑,要小心仔细对待。

原文链接:https://www.f2er.com/oracle/206025.html

猜你在找的Oracle相关文章