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

 

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 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

SQL> select * from table(dbms_xplan.display(format => 'advanced'));

PLAN_TABLE_OUTPUT

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

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

猜你喜欢

转载自blog.csdn.net/thy822/article/details/80254253
今日推荐