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协调成本。这些优化方法最好有统一的优化方案全局考量和跟踪,决不能各行其是,引起性能新问题;

ü        确定并行。并行处理是需要各种参数进行配合使用的,我们希望使用并行,就要保证实际执行的语句确实在进行并行处理。这要通过不断的跟踪执行计划和处理过程来实现。

并行技术主要使用在OLAP中,也可以使用在OLTP或者混合系统中(hybrid systems)。
并行技术就是让多颗CPU干以前1颗CPU做的事情。


并行技术能够改善如下情况:
    1.查询时需要大表扫描、joins或者分区索引扫描
    2.创建大索引
    3.创建大表
    4.Bulk inserts, updates, merges, and deletes
    

使用并行技术最好有如下条件:
    1.对称多处理器
    2.足够的IO带宽
    3.空闲或者间歇使用的CPU(如cpu使用率长期低于30%)
    4.足够的内存(主要用来sorts, hashing, and I/O buffers)

如果你的系统缺少上面任何一个条件,那么并行技术并不能明显提高系统性能。

什么时候使用并行技术?
    数据仓库。在OLTP中,批量处理以及维护性操作同样可以使用并行技术,如创建索引。

什么时候不适合使用并行技术?
    1.短查询、短事务(the typical query or transaction is very short (a few seconds or less))
    2.CPU、内存或I/O资源没有空闲。

数据库哪些操作可以使用并行
    1.Access methods
        Some examples are table scans, index full scans, and partitioned index range scans.

    2.Join methods
        Some examples are nested loop, sort merge, hash, and star transformation.

    3.DDL statements
        Some examples are CREATE TABLE AS SELECT, CREATE INDEX, REBUILD INDEX, REBUILD INDEX PARTITION, and MOVE/SPLIT/COALESCE PARTITION.
        含有LOB字段的表无法使用DDL 并行技术(One important restriction is that parallel DDL cannot be used on tables with object or LOB columns.)
        
    4.DML statements
        Some examples are INSERT AS SELECT, updates, deletes, and MERGE operations.
    
    5.混合SQL操作:Miscellaneous SQL operations
        Some examples are GROUP BY, NOT IN, SELECT DISTINCT, UNION, UNION ALL, CUBE, and ROLLUP, as well as aggregate and table functions.

    6.Parallel query
        如select,    DDL或者DML操作含有select语句的情况

    7.SQL*Loader,这个应当重视。用于数据多的导入,如
        sqlldr USERID=SCOTT/TIGER CONTROL=LOAD1.CTL DIRECT=TRUE PARALLEL=TRUE


并行如何工作?How Parallel Execution Works
    并行技术把一个SQL任务(task)分成多个小单元,每一个小单元被分开处理。同样,incoming data (tables, indexes, partitions)也被分成多个微粒(granules)。

    并行度: Degree of Parallelism
        并行技术协调2个或者多个并行执行服务(parallel execution servers)去处理一条SQL。并行执行服务(parallel execution servers)的数据量就称为"并行度"(degree of parallelism)。
        
        使用多CPU和磁盘来快速响应查询(queries)是并行技术的目的。但是,多个用户同时执行并行操作,CPU、内存及磁盘等资源会被快速耗尽。

    
    并行执行服务池:The Parallel Execution Server Pool
        实例启动,oracle创建一个并行执行服务池(The Parallel Execution Server Pool),这个池专门为并行操作服务。初始化参数 PARALLEL_MIN_SERVERS 决定了实例启动时,创
        建并行执行服务(parallel execution servers)的个数。

        查询当前parameter parallel_min_servers参数
        SQL> show parameter parallel_min_servers

                执行一个并行操作时,并行执行协调器(parallel execution coordinator)从并行执行服务池(The Parallel Execution Server Pool)获得并行执行服务器(parallel execution  servers),然后分配parallel execution servers去处理并行操作。如果需要,oracle会创建额外的并行执行服务(parallel execution servers),然后去处理并行操作。处理完毕    并行操作后,协调器把执行得到的数据结果返回给用户进程,然后把并行执行服务(parallel execution servers)还给并行执行服务池(The Parallel Execution Server Pool)。

        执行一条SQL,优化器决定是否执行并行操作以及并行度(the degree of parallelism (DOP))是多少。并行度(DOP)决定从并行服务池(The Parallel Execution Server Pool)中获得的并行服务器个数,如果池中的并行服务器不够,那么协调器会创建新的并行执行服务器。

        注意:
        1.并行执行协调器(parallel execution coordinator)和并行执行服务(the parallel execution servers)在一个时间段只能服务一个任务。一个并行执行协调器(the parallel execution servers)不能并行服务两个任务,比如一个协调器不能同时服务一个并写查询和一个并行DML操作。
        2.在SQL语句解析阶段协调器不会去调用并行执行服务器,只有在SQL语句的执行阶段才会去调用。 

 并行执行服务器数量的调整:Variations in the Number of Parallel Execution Servers
        1.oracle 实例(也就是内存)有明显变化,并行服务池中的并行执行服务器数量自动调整;
        2.并行操作明显增加,oracle会创建额外的并行服务器来满足需要。但是,并行执行服务器的数量绝对不会超过参数PARALLEL_MAX_SERVERS的设定值。
        3.并行操作减少,oracle终止空闲的并行执行服务器。但是,并行执行服务器的数量不会低参数PARALLEL_MIN_SERVERS的设定值。
        
        归纳成一个公式:
        PARALLEL_MIN_SERVERS <= 并行执行服务器的数量 <= PARALLEL_MAX_SERVERS

    并行执行服务器数量不足时咋处理:Processing Without Enough Parallel Execution Servers
        oracle执行并行操作时,至少需要2个并行执行服务器。        
        比如当前只有5个并行执行服务器可用,而一条SQL需要30个并行执行服务器,执行该SQL的后果是执行速度很慢。可以通过设定参数PARALLEL_MIN_PERCENT(百分比)来解决这个问题。该参数使用于DML、DDL以及QUERY。    
        
        SQL申请并行执行服务器的数量*PARALLEL_MIN_PERCENT <= 当前可用并行执行服务器数量
        举个例子,一条SQL执行需要50个并行执行服务器,我们设定PARALLEL_MIN_PERCENT 值为20,那么该SQL最少需要50*20%=10个并行执行服务器。如果申请不到10个并行执行服务器进程,oracle就会报ora 12827错误。
        当参数PARALLEL_MIN_PERCENT设定为null时,SQL执行时,至少获取2个并行执行服务器。 



模拟ORA-12827错误

SQL> create pfile from spfile;

File created.

SQL> shutdown immediate

修改初始化参数文件
cd $ORACLE_HOME/dbs
mv spfileemrep.ora spfileemrep.ora.bk
vi initemrep.ora 
---
*.parallel_max_servers=5
*.parallel_min_servers=2
*.parallel_min_percent=60
--

SQL> startup
ORACLE instance started.

生效
SQL> show parameter parallel
NAME                     TYPE            VALUE
------------------------------------ ---------------------- ------------------------------
parallel_max_servers             integer            5
parallel_min_percent             integer            60
parallel_min_servers             integer            2



表的并行度设为10
alter table d_test parallel 10;

现在表d_test的并行度设定为10,系统设置的parallel_min_percent为60
10*60%=6 > parallel_max_servers
也就是说至少有6个并行执行服务器,而现在parallel_max_servers只有5个

执行一条SQL
SQL> select count(*) from d_test;
select count(*) from d_test
                     *
ERROR at line 1:
ORA-12827: insufficient parallel query slaves available

报ORA-12827错误了。

把d_test的并行度设为8
alter table d_test parallel 8;

8*60%=4.8 < parallel_max_servers=5

再次执行SQL,不再报错
SQL> select count(*) from d_test;

  COUNT(*)
----------
  21869366

 设置并行度Setting the Degree of Parallelism for Parallel Execution,有下面几种方式:
        1.SQL语句级加PARALLEL hint(暗示)
            SELECT /*+ PARALLEL(orders, 4) */ COUNT(*) FROM orders;        
        2.session级别设置
            ALTER SESSION FORCE PARALLEL
        3.表级和索引级:
            ALTER TABLE orders PARALLEL 4;
            ALTER INDEX iorders PARALLEL 4;    
        

        DDL操作设定DOP
         create table test parallel 4 as select * from d_test where rownum<100;
         create index time_idx on test(time) parallel 4;
         ALTER INDEX time_idx rebuild parallel 5;

             
    
    oracle根据啥决定并行度
        1.SQL语句中的hint
        2.SESSION级别(ALTER SESSION FORCE PARALLEL)
        3.表级、索引级定义的级别
        
        并行度的优先级别从高到低:
        Hint->alter session force parallel->表,索引上的设定-> 系统参数
       
        在session可以决定开启或关闭表或索引设定的并行度,包括DML、DDL、QUERY
            关闭:ALTER SESSION DISABLE PARALLEL DML|DDL|QUERY;
            开启:ALTER SESSION ENABLE PARALLEL DML|DDL|QUERY;    
        session级别设定并行度:
        ALTER SESSION FORCE PARALLEL DML|DDL|QUERY PARALLEL 5;

    
    oracle默认(the default DOP)并行度
        1.根据cpu的个数、RAC实例数和PARALLEL_THREADS_PER_CPU决定。
        2.如果处理分区,分区的个数决定并行度。
        
        创建表默认并行度为1
        SQL> create table tt(id number);
        SQL> select table_name,degree from user_tables where table_name='TT';    

  1. TABLE_NAME DEGREE
  2.  --------------------------------------------- --------------------------------------------------------------------------
  3.         TT 1



        可以把表的并行度设为系统默认的并行度(the default DOP)
        alter table tt parallel;
        SQL> select table_name,degree from user_tables where table_name='TT';    

点击(此处)折叠或打开

  1. TABLE_NAME DEGREE
  2.         ------------------------------------------------------------ --------------------------------------------------------------------------------
  3.         TT DEFAULT

 

Oracle Parallel特性是一柄双刃剑,要小心仔细对待。

原文地址:https://www.cnblogs.com/gary-bao/p/4312935.html