现在的位置: 首页 > 综合 > 正文

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

2013年01月03日 ⁄ 综合 ⁄ 共 4587字 ⁄ 字号 评论关闭

并行(Parallel)操作特性,是Oracle为更充分利用服务器硬件处理资源,提高特定大数据量操作效率,应对海量生产数据而推出的一种技术特性。通常,我们进行的SQL处理都是单进程操作,对应单个CPU操作单元。所谓的并行操作,就是在软硬件条件允许的情况下,Oracle调用多个处理单元分别进行处理,最后汇合结果的过程。对一些SQL进行有计划的并行操作,可以显著提高系统操作速度。

 

1、海量数据的困局

 

互联网络时代给世界带来很多变化,其中一项就是信息的爆炸,数据呈几何级数增长。数据库随之进入海量、洋级时代,TB级数据库已经越来越频繁的出现在各类型应用场景中。开发人员和DBA就不得不面对一个困局,如果处理海量数据。

 

 

在传统时代,我们最常借助的一个优化手段是索引。通过检索较少的数据块,获取到符合条件的数据行rowid。“索引进入执行计划,替代全表扫描”成为我们优化的重要导向。但是,索引路径不是用户最终体验。随着数据量的增大(单表上G),即使我们的执行计划很完美,检索索引+数据块定位的时间损耗可能依然不能满足客户需求。其次,一些特定系统类型(如OLAP系统),可能就是要进行全表扫描操作,对所有数据进行检索处理。这些场合下,传统的索引中心优化就无用武之地了。

 

 

在计算机科学中,“分治”这种古老的思想一直扮演着重要地位,无论是在软件算法还是在硬件的体系。近年来,硬件技术,特别是多核CPU、多CPU计算机的逐渐普及,使得多核计算机、服务器开始出现在企业应用领域。多核CPU和多CPU本质上就是多处理单元并行的基础。将一个任务划分为若干个子任务,交由不同的处理单元进行同时处理,之后将结果集合汇总,是通用的单任务多处理进程模型。应该说,并行技术是建立在软硬件技术基础之上的,其中硬件技术是一个决定要素。

 

2Oracle的并行处理

 

Oracle并行处理(Parallel Processing)特性主要是针对SQL语句处理的并行。目前Oracle提供支持并行的操作包括如下类型:

 

ü       并行查询操作;

ü       并行DDL。对数据对象的DDL操作;

ü       并行DML。进行并行的数据更新修改;

 

在具体的应用场景上,有如下场景:

 

ü       数据表、索引范围扫描的查询;

ü       批量增加、修改和删除操作;

ü       数据表、索引对象的创建;

ü       DBMS_STATS”收集统计量;

ü       备份恢复管理Recovery Manager的使用;

 

Oracle中,一共包括三种进程Process类型,分别为客户进程Client Process、服务进程Server Process和后台进程Background Process。其中,进行数据块读取、修改写入等实际操作的都是服务进程Server ProcessServer Process是客户进程在数据库实例上的代理进程,保持着一对一的关系。由此,一般的SQL语句都是单进程串行操作的。

 

Oracle并行操作涉及的过程同一般并行操作的模型基本相似,包括处理单元和协调单元两类进程组成。首先,处理的单一任务划分为若干子任务。在协调进程(Coordinator)的作用下,并行操作被划分为若干子任务,分别传递给多个并行服务进程进行处理。之后,各个进程将处理结果进行汇总,交付给协调进程进行组合,作为统一的结果返回。

 

并处处理在Oracle中是一个配置过程,包括很多参数配置和概念要素。其中最重要的两个概念就是并行度和并行伺候进程池。下面分别来介绍两个概念和相关的配置项目。

 

3、并行度和并行伺候进程池

 

并行度DOPDegree Of Parallel)定义了进行并行操作时并行流的个数。DOP可以理解成进行并行处理时候,划分的并行处理单元个数。但是,在实际的情况看,进行并行处理的进程个数往往是DOP的两倍,也就是一个并行流实际上是两个处理进程在进行处理工作。这样的配置通常是为了实现进程之间的协调合作,缓解各个处理环节上的速度不匹配现象。

 

并行度DOPOracle并行操作中一个重要的配置参数。目前的Oracle版本中,支持手工配置和自动配置DOP两种方式。如果是手工指定并行度,就需要在SQL语句上,通过hint来制定并行度的个数。自动配置DOP的含义是Oracle根据当前实际负载和并行进程池的状况,经过计算自动的出的适应性并行度。下面是一些Oracle中与并行度相关的参数。

 

 

SQL> show parameter parallel

 

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

fast_start_parallel_rollback        string     LOW

parallel_adaptive_multi_user        boolean    TRUE

parallel_automatic_tuning           boolean    FALSE

parallel_degree_limit               string     CPU

parallel_degree_policy              string     MANUAL

parallel_execution_message_size     integer    16384

parallel_force_local                boolean    FALSE

parallel_instance_group             string     

parallel_io_cap_enabled             boolean    FALSE

parallel_max_servers                integer    10

parallel_min_percent                integer    0

parallel_min_servers                integer    0

parallel_min_time_threshold         string     AUTO

parallel_server                     boolean    FALSE

parallel_server_instances           integer    1

parallel_servers_target             integer    4

parallel_threads_per_cpu            integer    2

recovery_parallelism                integer    0

 

 

上面参数的含义,会在本系列中逐渐使用和介绍。

 

DOP是一个配置项目,实际的并行工作还需要真是存在的进程完成。从上文的背景介绍中,一个session只对应一个Server Process,进行操作处理实际都需要Server Process来完成。并行处理中,Oracle引入了并行伺候进程池的概念。并行伺候进程池是一个进程的集合,针对需要进行并行处理的SQL操作,会从处理池中分配出适当数量的服务进程来进行处理。

 

一些与并行服务进程相关的参数,如下:

 

SQL> show parameter parallel_m

 

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

parallel_max_servers                integer    10

parallel_min_percent                integer    0

parallel_min_servers                integer    0

 

 

 

4、一个并行Query的示例

 

下面针对一个大数据量表,演示一下并行SQL的执行计划。首先还是环境准备:

 

 

SQL> select * from v$version where rownum<2;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database11gEnterpriseEdition Release11.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;

已解释。

抱歉!评论已关闭.