当前位置:Gxlcms > 数据库问题 > Oracle“并行执行”之一——How to work

Oracle“并行执行”之一——How to work

时间:2021-07-01 10:21:17 帮助过:9人阅读

摘自《VLDB and Partitioning Guide》

1、介绍parallel execution

并行执行功能可以让单个数据库操作在多个CPU和IO设备上进行执行。在DSS和数据仓库系统等大数据量系统中,它可以极大地减少响应时间。在OLTP系统中,它对批量操作以及类似创建索引的系统维护任务也有用武之地。其只要的思路就是将一个任务进行分解,将一个人的活分给多个人一起做。常用的场景包括:

1)大表扫描、连接,以及分区索引扫描

2)创建大索引

3)创建大表(包括物化视图)

4)批量插入、更新、合并和删除数据

另外,还适用于对象类型,比如并行操作LOB。

当所需的并行服务器进程不足时,系统会将这些并行活动放入队列。当然,只有当parallel_degree_policy设置为AUTO时,才会启用这个特性。当满足条件时,系统又会按照FIFO的顺序执行这些并行操作。即使当前的并行资源满足后面的并行活动,系统也要按照FIFO的原则依次执行。你也可以通过安装配置资源计划,对consumer group中并行操作的先后次序以及并行服务器进程数进行控制。

可以并行执行的操作主要有:

1)存取方法

比如,table scans, index fast full scans, and partitioned index range scans。

2)连接方法

比如,nested loop, sort merge, hash, and star transformation。

3)DDL

比如,CREATE TABLE AS SELECT, CREATE INDEX, REBUILD INDEX, REBUILD INDEX PARTITION, and MOVE/SPLIT/COALESCE PARTITION。

4)DML

比如,INSERT AS SELECT, UPDATE, DELETE, and MERGE。

5)并行查询

比如,SELECT语句。

6)其它SQL语句

比如,GROUP BY, NOT IN, SELECT DISTINCT, UNION, UNION ALL, CUBE, and ROLLUP, plus aggregate and table functions。

7)SQL*Loader

比如,

sqlldr CONTROL=LOAD1.CTL DIRECT=TRUE PARALLEL=TRUE

sqlldr CONTROL=LOAD2.CTL DIRECT=TRUE PARALLEL=TRUE

sqlldr CONTROL=LOAD3.CTL DIRECT=TRUE PARALLEL=TRUE

2、语句并行执行过程

每个SQL语句解析时,都会经历最优化和并行化的过程。当决定采用并行执行后,后续步骤有:

1)当前用户进程或影子进程(shadow process)担当起协调者的角色,常被称做查询协调器QC。

2)QC获取必要数量的并行服务器。

3)SQL语句被拆分为一系列的操作,然后由并行服务器逐一并行完成。

4)当并行服务器完成并行任务后,由QC执行剩余的无法并行完成的任务。例如,并行查询中的SUM操作需要将并行服务器中的子集进行汇总。

5)最后,QC将结果返还给用户。

当优化器决定了SQL语句的执行计划后,QC需决定执行计划中每一个操作的并行执行方法。例如,并行执行方法可能为按块并行全表扫描,或者为按分区并行索引扫描。QC必须决定每一个操作能否并行执行,以及并行服务器数量。

将任务分发给并行服务器

并行执行协调器检查执行计划中的每一个操作,然后决定如何将待处理的数据分发到各个并行执行服务器。看下面这个并行查询例子,同时有两种类型并行(intra- and inter-operation parallelism)。

Example 8–1 Running an Explain Plan for a Query on Customers and Sales

EXPLAIN PLAN FOR

SELECT /*+ PARALLEL(4) */ customers.cust_first_name, customers.cust_last_name,

MAX(QUANTITY_SOLD), AVG(QUANTITY_SOLD)

FROM sales, customers

WHERE sales.cust_id=customers.cust_id

GROUP BY customers.cust_first_name, customers.cust_last_name;

Explained.


技术分享

技术分享

技术分享

各个操作之间的并行

如Figure 8-1所描述,上述查询计划包括两组并行执行服务器SS1和SS2,每个服务器组(SS1和SS2)都有4个执行进程,这4个进程是由查询语句中parallel提示指定DOP(degree of parallelism)而产生的。

SS1扫描customers表,然后将数据行发送给SS2,由其来构造hash表。换言之,生产者SS1和消费者SS2同时工作,一个并行扫描customers表,另一个并行消费这些数据行且构造HASH连接所需的HASH表。这就是一个inter-operation并行的例子。

扫描完CUSTOMERS表后,SS1接着并行扫描SALES表。SS1发送SALES表的数据行给SS2,SS2接着完成HASH连接中的探测工作(PROBE)。当SS1执行完数据行扫描并发送给SS2后,SS1接着并行执行GROUP操作。两组并行执行服务器(SS1和SS2)就是这样一起工作,以inter-operation并行的方式,完成查询树中的各个不同操作的。

并行执行的另外一个重要部分就是数据行如何从一组并行服务器分发到另一组并行服务器。以Example 8–2中的查询计划来说,SS1某一个服务器进程扫描出CUSTOMERS表一行,应将此行发给SS2中哪一个服务器进程呢?在这个例子中,这个分发操作是通过对连接字段进行HASH分区来完成的。扫描CUSTOMERS表的数据行时,并行服务器同时计算customers.cust_id列值的HASH值,其根据这个HASH值来判断数据行的SS2中目标服务器进程。并行查询中使用到的分发方法会在EXPLAIN PLAN执行计划列表中的Distrib列明确给出。Figure 8–1, "Data Flow Diagram for Joining Tables",EXPLAIN PLAN中的5、8、12行的Distrib列均可以看到。

生产者/消费者操作

某些操作需要其它操作的输出结果,这类操作被称之为消费者操作。Figure 8–1,GROUP BY SORT操作就是HASH JOIN操作的消费者,因为GROUP BY SORT操作需要HASH JOIN的结果。

一旦生产者操作开始生产数据行,消费者操作就开始消费数据行。Example 8–2,当并行服务器FULL SCAN表SALES开始生产数据行时,另一组并行服务器就开始消费数据行——HASH JOIN操作。

这两个操作都是由各自并行服务器组同时进行工作。所以,查询操作和数据流树自身(DATA FLOW TREE)都会并行执行。独立操作的并行,称之为intra-operation并行;数据流树中各个操作之间的并行,称之为inter-operation并行。由于数据库中生产者、消费者的特点,数据流树中只能有两个操作同时进行工作,以便减少执行时间。为了描述intra- 和inter-operation并行,看以下这个语句:

SELECT * FROM employees ORDER BY last_name;

其执行计划包括对employees表的全表扫描,接着对结果根据last_name列进行排序。这里我们假定last_name列没有索引,同时假定DOP为4(这意味着任何并行操作都会有4个并行服务器)。Figure 8–2描述这个语句的并行执行情况。

技术分享

如上图所示,虽然DOP为4,但实际上有8个并行执行服务器。这是因为生产者/消费者操作需要同时并行执行(即inter-operation并行)。同时,我们也可以看到负责全表扫描的并行服务器将数据行发送到相对应的负责排序操作的并行服务器进程。如果被全表扫描出的某一行的last_name列值介于A-G之间,它会被发送给负责排序操作的第一个并行服务器。当扫描操作完成后,排序操作就将排好序的结果返回给查询协调器QC;QC会将结果返回给用户。

3、并行执行服务器如何协调

为了并行执行一个查询,Oracle数据库通常会产生一组生产者服务器进行,和一组消费者服务器进程。生产者进程从表上获取数据行,消费者进程则在这些数据行上执行join, sort, DML, and DDL这些操作。生产者进程组中每个服务器,与消费者组中的每个服务器,都会有一个连接。这些虚拟连接的数量等于DOP的平方。每个通信管道都至少有一个内存缓冲区,最多有四个。这些内存缓冲区来源于共享池。多个内存缓冲区有利于并行服务器之间的异步通信。

单实例环境中每个通信管道最多有3个缓冲区,RAC环境中每个通信管道最多有4个缓冲区。Figure 8–3描述了消息缓冲区以及生产者服务器进程如何与消费者服务器进程连接的。

技术分享

同一个实例中各个并行服务器进程通过共享池的缓冲区,来回传递信息。不同实例之间并行服务器通过外部高速网络协议进行传递消息。Figure 8–3,DOP等于并行服务器数量。另外,Figure 8–3也没有画出并行执行协调器。实际上,每个并行服务器都有一个指向协调器的额外连接。使用并行执行时共享池大小很重要,因为如果没有足够大小来为并行执行分配内存缓冲区,并行执行会失败。

4、如何确定并行度(DOP)?

单个操作上的并行服务器数量,称之为并行度(DOP)。并行执行是用来有效使用多CPU的。Oracle并行执行框架允许我们手工指定一个DOP,也可由数据库自身控制选择一个合适的值。

手工指定DOP

Oracle中可以要求某一指定的并行度。例如,你可以在表级、索引级上指定DOP:

ALTER TABLES sales PARALLEL 8;

ALTER TABLE customers PARALLEL 4;

在这种情况下,针对单个SALES表的查询的并行度为8,对单个CUSTOMERS表的查询的并行度为4。对两个表同时查询的并行度为8(采用高的DOP),而且会分配16个并行服务器(生产者和消费者各8个)。

当指定的PARALLEL从句没有具体DOP值时,则此对象会获得缺省的DOP值。缺省DOP由以下公式决定:

■对于单实例环境, DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT

■对于RAC环境, DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT

缺省情况下,INSTANCE_COUNT等于集群中所有的节点数。然而,如果你使用service限制了实例数量,则INSTANCE_COUNT就等于service中的实例数量。

上述的缺省DOP算法,用来使用最大数量的资源,而且假定使用越多的资源任务完成地越快。缺省算法适用于单用户环境。在多用户环境下,不建议使用缺省并行度。

另外,SQL语句的并行度可以由资源管理器来设置或限制。

自动并行度策略

参数PARALLEL_DEGREE_POLICY设置为AUTO后,数据库会自动决定SQL语句能否并行运行、并行度大小。数据库还能决定SQL语句立刻执行还是排队以便有足够资源时再次执行。最后,数据库还决定SQL语句能否利用汇总的集群内存。

当并行度策略设置为AUTO后,SQL语句的并行处理过程简要描述如下:

1)SQL语句发出请求。

2)SQL语句被解析,生成执行计划。

3)检查参数PARALLEL_MIN_TIME_THRESHOLD指定的极限值:

如果评估的执行时间小于此极限值,则串行执行;

如果评估的执行时间大于此极限值,则SQL语句按照优化器计算的DOP并行执行。

确定DOP(并行度)

基于SQL语句的资源要求,优化器自动决定其并行度。优化器根据执行计划中扫描操作的成本(full table scan, index fast full scan等)来决定SQL语句必要的并行度。

然而,为了防止拖垮整个数据库,优化器会限制实际的DOP来保证并行服务器数量。这个限制是由参数PARALLEL_DEGREE_LIMIT设置的。这个参数的缺省值为CPU,其意味着并行服务器的数量是由系统的CPU数量来决定的(PARALLEL_THREADS_PER_CPU * CPU_COUNT * 可用的instance数量,即为缺省DOP)。通过调整参数值,你可为此SQL语句设置最大可用DOP。

在执行计划的NOTE栏可看到优化器所确定的DOP,在EXPLAIN PLAN语句或者V$SQL视图中均看到此执行计划。

技术分享

控制自动DOP的第二个参数是PARALLEL_MIN_TIME_THRESHOLD。SQL语句计算自动DOP前,这个参数指定了SQL语句的最小执行时间。缺省是10秒。优化器首先计算此SQL语句的串行执行计划,当评估的执行时间大于PARALLEL_MIN_TIME_THRESHOLD参数值,则考虑自动DOP。

控制自动DOP

系统有两个参数可以控制自动DOP,PARALLEL_DEGREE_POLICY和PARALLEL_MIN_TIME_THRESHOLD。另外,还有两个提示可以控制并行。

你可以通过ALTER SESSION来设置DOP,如下所示:

ALTER SESSION SET parallel_degree_policy = limited;

ALTER TABLE emp parallel(degree default);

你也可以使用PARALLEL提示来强制并行。它有可选的参数:SQL语句执行时的DOP。另外,NO_PARALLEL提示会覆盖创建表或修改表的DDL语句中指定的PARALLE参数。

下面这个例子强制并行执行SQL:

SELECT /*+parallel */ ename, dname FROM emp e, dept d WHERE e.deptno=d.deptno;

下面这个例子强制并行执行SQL,而且指定DOP为10

SELECT /*+ parallel(10) */ ename, dname FROM emp e, dept d

WHERE e.deptno=d.deptno;

下面这个例子强制串行执行:

SELECT /*+ no_parallel */ ename, dname FROM emp e, dept d

WHERE e.deptno=d.deptno;

下面这个例子强制自动计算DOP:

SELECT /*+ parallel(auto) */ ename, dname FROM emp e, dept d

WHERE e.deptno=d.deptno;

下面这个例子强制使用11.1版本的特性:

SELECT /*+ parallel(manual) */ ename, dname FROM emp e, dept d

WHERE e.deptno=d.deptno;

缓存中并行执行

当参数PARALLEL_DEGREE_POLICY设置为AUTO后,数据库会判断一个并行执行的对象能否受益于将此对象缓存于SGA。是否缓存对象取决于一组包含对象大小和访问频率的算法。在RAC环境中,数据库会将对象的各部分数据映射到各个实例的BUFFER CACHE中。通过创建这个映射关系,数据库能够自动读取对应的BUFFER CACHE来获取此对象的各部分数据。使用这个映射信息,避免了不同实例同时从磁盘中读取相同的数据,从而最大化了用来缓存对象的缓冲区大小。如果此对象的大小超过了BUFFER CACHE的大小(RAC环境中包括所有实例的BUFFER CACHE),那这个对象就会以direct-path读方式来进行读取。

自适应并行

在多用户环境中,当系统负载增加时,其自适应多用户算法(缺省已开启),会自动降低SQL语句的并行度。当使用自适应并行特性时,数据库会对SQL执行时间使用一个算法,以便决定接受SQL语句要求的DOP,还是降低DOP以防止系统过载。

在一个偏好高DOP并行执行语句的系统中,自适应算法会自动调低其DOP。当算法仍要保证最优利用资源时,用户可能会感受到不一致的响应时间。在一个要求确定性的响应时间的环境中,使用自适应并行并不被ORACLE所建议。自适应并行由系统参数PARALLEL_ADAPTIVE_MULTI_USER来控制。

控制自动DOP、并行SQL语句排队、缓存并行执行

初始化参数PARALLEL_DEGREE_POLICY控制着是否启用自动DOP、并行SQL语句排队、缓存并行执行。这个参数有3个值:

MANUAL:禁用自动DOP、并行语句排队、缓存并行执行。其并行执行的行为特点返回到11.2版本之前。缺省值。

LIMITED:对某些语句启用自动DOP,禁用并行语句排队、缓存并行执行。自动DOP只对那些存取明确指定PARALLEL属性的表或索引的SQL语句进行启用。

AUTO:启用自动DOP、并行SQL语句排队、缓存并行执行。

缺省情况下,只有在对象上明确指定并行度或者在SQL语句上指定PARALLEL提示的情况下,系统才会启用并行。不会启用并行SQL语句排队,而且,并行执行也不会使用缓存。

如果你想让数据库自动决定SQL语句中某一部分的并行度,则需设置PARALLEL_DEGREE_POLICY参数为LIMITED,而且设置此部分SQL语句所包含对象的PARALLEL从句。如果你想让数据库自动决定整个SQL语句的并行度,则需设置参数PARALLEL_DEGREE_POLICY为AUTO。

当PARALLEL_DEGREE_POLICY参数设置为AUTO后,数据库将会根据执行计划中操作成本和硬件特性来决定SQL语句能否并行执行。硬件特性包括IO校准统计信息,所以需要收集这些统计信息,否则数据库不会使用自动并行执行特性。

如果IO没有运行校准来收集统计信息,SQL语句的执行计划会出现以下信息:

automatic DOP: skipped because of IO calibrate statistics are missing

IO校准统计信息可以通过执行系统过程DBMS_RESOURCE_MANAGER.CALIBRATE_IO进行收集。IO校准是一次性操作,除非物理硬件发生变化。

5、并行排队机制

当参数PARALLEL_DEGREE_POLICY设置为AUTO时,数据库会将那些并行服务器资源得不到满足的SQL语句放入队列。当这些SQL语句的所需资源可用时,会按照FIFO的次序出队,然后重新执行。默认的出队次序就是基于SQL语句的发布时间先进先出。

并行语句处理过程如下:

1)SQL语句发布。

2)解析SQL语句,自动决定DOP。

3)检查并行服务资源的可用情况:

如果系统中有足够的并行资源,而且队列中当前语句前面没有其它排队语句,当前SQL语句会执行。

如果系统中没有足够的并行服务器,当前SQL语句会基于特定的条件进入队列。当满足特定的条件后,SQL语句又会从队列的前面出队。

并行SQL语句运行时会增加系统中的并行服务器进程数量。如果此时系统中的所有活动的并行服务器数量超过PARALLEL_SERVERS_TARGET参数设置的值,系统会将此SQL语句放入等待队列中。例如,PARALLEL_SERVERS_TARGET参数值为64,当前活动的并行服务器数量为60。一条新发布的并行语句需要16个并行服务器,由于60+16超过PARALLEL_SERVERS_TARGET参数设置的值64,系统会将此语句放入等待队列中。

PARALLEL_SERVERS_TARGET参数的缺省值为:

PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 2

这个值不是系统允许的最大并行服务器数量,而是使用并行语句排队前的并行服务器的数量。这个值小于PARALLEL_MAX_SERVERS参数所设置的系统允许的最大并行服务器数量,保证所有并行语句能够得到所需的资源,防止整个系统过载。对于串行执行(非并行)的SQL语句,系统会立即执行,不管并行SQL语句排队特性是否启用。

如果1条SQL语句进入等待队列,它会产生等待事件resmgr:pq queued。

使用RESOURCE MANAGER管理并行排队

注:这个功能从版本11.2.0.2开始可用

缺省情况下,并行排队特性使用的是FIFO的次序。通过配置和设置资源计划,你可以控制队列中并行语句的出队次序,以及每个并行任务或消费者组的并行服务器数量。

资源管理器、消费者组,均可以由DBMS_RESOURCE_MANAGER包进行创建。一个资源计划包含着针对消费者组的一组指令,它们对系统资源进行分配、控制,包括并行服务器。启用资源计划,可通过将RESOURCE_MANAGER_PLAN参数设置为资源计划的名字来实现。

在并行度策略设置为AUTO情况下,资源管理器通过指令对消费者组的并行SQL语句进行管理。主要内容包括:

  • 管理并行队列的次序
  • 限制每个消费者组的并行服务器资源
  • 指定每个消费者组的排队超时时间
  • 指定每个消费者组的并行度限制
  • 管理并行队列SQL语句的示例

在RAC环境中,并行队列也是统一使用一个队列进行管理。对每个消费者组的限制,会分别应用于RAC中属于这个消费者组的所有会话。并行语句是否排队取决于所有实例的PARALLEL_SERVERS_TARGET参数值之和。

  • 管理并行队列的次序

你可以用资源管理器管理队列中并行语句的出队次序。对于特定每个消费者组的并行语句,总是以FIFO的方式出队。指令mgmt_p1 ... mgmt_p8用来决定下一次哪一个消费者组的并行语句出队执行。这些指令通过DBMS_RESOURCE_MANAGER包的CREATE_PLAN_DIRECTIVE或UPDATE_PLAN_DIRECTIVE过程进行配置。举例来说,你创建PQ_HIGH, PQ_MEDIUM,PQ_LOW三个消费者组,并且将并行会话按照优先级映射上去;设置mgmt_p1参数,70% for PQ_HIGH, 25% for PQ_MEDIUM, and 5% for PQ_LOW.这意味着,PQ_HIGH组语句下一次出队有70%的可能,PQ_MEDIUM组语句下一次出队有25%的可能,PQ_LOW下一次出队有5%的可能。

  • 限制每个消费者组的并行服务器资源

你可以使用资源管理器限制低优先级消费者组的并行语句能够获得的并行服务器数量。使用资源管理器将并行会话映射到不同的消费者组上,而每个消费者组又有并行服务器数量的使用限制。如果指定这个数量限制并且实际需求超过了这个限制,则这个消费者组的并行语句就会排队等候。

当数据库中有高优先级消费者组、低优先级消费者组时,这种限制是有使用价值的。如果没有这个限制,用户可能在低优先级消费者组中发布大量的并行语句,占用了系统中所有的并行服务器。当高优先级消费者组发布一个并行语句时,资源分配指令会确保高优先级并行语句先出队。通过限制低优先级消费者组能够使用的并行服务器数量,你可以为高优先级消费者组预留一些并行服务器。

你可以使用DBMS_RESOURCE_MANAGER包中的CREATE_PLAN_DIRECTIVE方法的parallel_target_percentage参数以及UPDATE_PLAN_DIRECTIVE方法的new_parallel_target_percentage参数,来限制消费者组可以使用的并行服务器数量。parallel_target_percentage和new_parallel_target_percentage参数指定RAC范围内并行服务器池的最大使用百分比(并行服务器池数量由PARALLEL_SERVERS_TARGET参数指定)。

举个例子,在一个两节点RAC环境中,PARALLEL_SERVERS_TARGET参数等于32,那就意味着并行排队前有64个并行服务器可供使用。你可以设置PQ_LOW组使用50%的并行服务器资源(parallel_target_percentage = 50),低优先级语句就可以映射到PQ_LOW上。这种情况就可以限制PQ_LOW中所有语句最多只能使用64 x 50% = 32个并行服务器,即使系统中还有未使用完的并行服务器。当PQ_LOW组使用了32个并行服务器后,这个消费者组的其它语句会进入队列。

在一个数据库中可能有一些会话的并行度策略设置为MANUAL,另外一些会话设置为AUTO。只有设置为AUTO的会话才会进行排队。然而,对于那些并行度策略设置为MANUAL的会话所使用的并行服务器,会被包含在消费者组使用的并行服务器数量中。

  • 指定每个消费者组的排队超时时间

你可以使用资源管理器指定最大排队时间,以便并行语句不会排队太长时间。使用资源管理器可以将并行会话映射到具有不同排队时间的消费者组上。

可以使用DBMS_RESOURCE_MANAGER包中CREATE_PLAN_DIRECTIVE方法的parallel_queue_timeout参数、UPDATE_PLAN_DIRECTIVE方法的new_parallel_queue_timeout参数,对排队时间进行管理。parallel_queue_timeout和new_parallel_queue_timeout参数指定并行语句可以在消费者组队列中的排队时间,以秒为单位。一旦时间到期,并行语句报出错误ORA-7454中断执行,并从队列中移除。

  • 指定每个消费者组的并行度限制

你可以使用资源管理器为每个消费者组指定并行度。使用资源管理器可以将并行会话映射到不同并行度的消费者组上。

可以使用RESOURCE_MANAGER包中CREATE_PLAN_DIRECTIVE方法的parallel_degree_limit_p1参数、UPDATE_PLAN_DIRECTIVE方法的new_parallel_degree_limit_p1参数,对每个消费者组的并行度限制进行管理。parallel_degree_limit_p1 和 new_parallel_degree_limit_p1参数为任何操作指定并行度限制。

举例来说,你可以创建PQ_HIGH, PQ_MEDIUM, PQ_LOW消费者组,并根据优先级将并行会话映射到消费者组上。然后你就可以创建一个指定并行度限制的资源计划,PQ_HIGH组的并行度限制为16, PQ_MEDIUM组的并行度限制为8,PQ_LOW组的并行度限制为2。

  • 管理并行队列SQL语句的示例

这个场景描述了如何使用资源管理器和消费者组对并行队列中的SQL语句进行管理。假设这个数据仓库负载环境中有3种类型SQL语句:

运行时间很短的SQL语句:运行时间不超过1分钟。期望这些SQL语句有着很好的响应时间。

运行时间中等的SQL语句:运行时间超过1分钟,但不超过15分钟。期望这些SQL语句有着合理的响应时间。

运行时间较长的SQL语句:运行时间超过15分钟。这些SQL语句都是一些特定任务或复杂的查询。它们会运行很长时间。

对于这个数据仓库环境,你希望那些运行时间短的SQL语句有着更好的响应时间。为了满足这个要求,你必需:

1)运行时间较长的SQL语句不能占用所有的并行服务器,以避免运行时间短的SQL语句进入队列等待;

2)当运行时间短的语句和运行时间长的语句都进入队列等待时,运行时间短的SQL语句应能够先于运行时间长的语句出队执行;

3)限制运行时间短语句的DOP,因为很高的DOP虽然占用了大量的并行服务器但效果并不明显。

Example 8–3描述了如何使用资源管理器对消费者组的并行队列中SQL语句设置优先级。注意下面几点:

缺省情况下,所有用户都被分配到OTHER_GROUPS组中。如果SQL语句评估执行时间超过1分钟,这个用户会切换到MEDIUM_SQL_GROUP组中。由于switch_for_call设置为TRUE,那意味着用户执行完这个SQL语句后会自动切换回OTHER_GROUPS组。如果这个用户在MEDIUM_SQL_GROUP组中,而且SQL语句的评估执行时间超过15分钟,那这个用户会切换到LONG_SQL_GROUP组。同样,由于switch_for_call设置为TRUE,待SQL语句执行完后用户会自动切换到OTHER_GROUPS组。用来完成切换过程的指令包括switch_time, switch_estimate, switch_for_call, 和switch_group。

当活动的并行服务器数量达到PARALLEL_SERVERS_TARGET参数设定的值后,随后的SQL语句会排队等候。指令mgmt_p[1-8]控制着并行语句出队执行的次序(当有足够的并行服务器时)。这个例子中mgmt_p1为SYS_GROUP组设置为100%,所以SYS_GROUP中的并行语句首先出队执行。如果SYS_GROUP组中没有排队的并行SQL语句,那么OTHER_GROUPS组中的并行语句有70%的可能出队执行,MEDIUM_SQL_GROUP有20%的可能,LONG_SQL_GROUP有10%的可能。

使用指令parallel_degree_limit_p1限制OTHER_GROUPS组的并行SQL语句的DOP为4。

为防止LONG_SQL_GROUP组并行语句使用了所有的并行服务器(这会导致OTHER_GROUPS和MEDIUM_SQL_GROUP组中的并行SQL在队列中等待很长时间),设置parallel_target_percentage指令为50%。当LONG_SQL_GROUP组并行SQL语句使用完50%的并行服务器后(PARALLEL_SERVERS_TARGET参数设定允许使用的并行服务器数量),后续的并行SQL会排队等待。

由于LONG_SQL_GROUP组并行SQL语句可能会等待很长时间,设置了一个超时时限,14400秒(4小时)。当LONG_SQL_GROUP组中某条SQL语句排队等待4个小时,中断执行并报错ORA-7454。

技术分享

技术分享

使用BEGIN_SQL_BLOCK .. END_SQL_BLOCK对并行SQL语句分组

注:这个功能从版本11.2.0.2起可用。

对于包含多个并行SQL语句的报表或批量任务来说,尽可能快地完成任务通常很重要。举例来说,当许多报表同时执行时,你可能想让所有这些报表尽可能快地完成。然而,你有时会想让某些报表先执行完,而不是所有报表同时执行完毕。

如果一个报表包含多个并行SQL语句,而且PARALLEL_DEGREE_POLICY参数设置为AUTO,那么在一个比较忙的数据库中所有的并行语句可能都会排队等待。举个例子来描述SQL处理的过程:

serial statement

parallel query - dop 8

-> wait in queue

serial statement

parallel query - dop 32

-> wait in queue

parallel query - dop 4

-> wait in queue

对于需要快速完成的报表,并行SQL语句需要组合在一起,以达到以下效果:

start SQL block

serial statement

parallel query - dop 8

-> first parallel query: ok to wait in queue

serial statement

parallel query - dop 32

-> avoid or minimize wait

parallel query - dop 4

-> avoid or minimize wait

end SQL block

使用DBMS_RESOURCE_MANAGER 包的BEGIN_SQL_BLOCK方法和END_SQL_BLOCK方法,来完成对并行SQL语句进行组合。对每一个消费者组来说,并行队列是按照队列中的每条语句的时间进行排序的。典型的,这个时间是每条语句入队的时间(这意味着FIFO)。当并行语句被BEGIN_SQL_BLOCK方法、END_SQL_BLOCK方法组合在一个SQL块中时,第一条语句还使用它入队的时间。而第二条以及后续的并行语句,会被特殊处理,会把第一条语句的入队时间作为自己的入队时间。利用这个功能,这些SQL语句经常会移动到队列的前面。这种优先对待可使它们的时间最小。

使用提示管理并行SQL语句排队

你可以在SQL语句中使用NO_STATEMENT_QUEUING 和STATEMENT_QUEUING提示管理并行语句排队。

  • NO_STATEMENT_QUEUING

当PARALLEL_DEGREE_POLICY参数设置为AUTO,这个提示会让SQL语句忽略并行排队。例如:

SELECT /*+ NO_STATEMENT_QUEUING */ emp.last_name, dpt.department_name

FROM employees emp, departments dpt

WHERE emp.department_id = dpt.department_id;

  • STATEMENT_QUEUING
当PARALLEL_DEGREE_POLICY参数未被设置为AUTO,这个提示延迟SQL语句的执行,直到要求DOP得到满足才会执行。例如:

SELECT /*+ STATEMENT_QUEUING */ emp.last_name, dpt.department_name

FROM employees emp, departments dpt

WHERE emp.department_id = dpt.department_id;

6、并行服务器池

当实例启动时,数据库会创建一个并行服务器池,供所有并行操作使用。PARALLEL_MIN_SERVERS参数指定实例启动时创建的并行服务器数量。

当执行并行操作时,并行执行协调器从池中获取并行服务器并分配给并行操作。如果有必要,并行协调器额外创建并行服务器。在整个执行过程中,这些并行服务器都会同它们的并行操作一起。当这些语句执行完毕后,并行服务器会返回到池中。

随着并行操作的数量增加,数据库会响应的增加并行服务器来处理传入的请求。然而,数据库不会创建超过PARALLEL_MAX_SERVERS参数所设定的数量的并行服务器。

如果并行操作的数量减少,数据库会把一些闲了一定时间的并行服务器进程中止掉。然而,数据库不会将池中的并行服务器减少到小于PARALLEL_MIN_SERVERS参数设置的值,无论这些并行服务器进程闲了多长时间。

并行服务器不足的处理方式

数据库允许以小于语句自身请求DOP的方式执行一个并行操作。如果池中的并行服务器都被占用,而且启动的并行服务器已达到设置的最大值,那这个SQL语句就只好串行执行。

详见PARALLEL_MIN_PERCENT参数和PARALLEL_MAX_SERVERS参数的介绍。

7、并行granule

并行任务的基本单元,叫做granule。数据库会将并行操作(比如,a table scan, table update, or index creation)分解为许多granule。并行执行进程一次执行一个granule。granule的数量和大小,与DOP相关。granule的数量也会影响多个服务器进程能否均衡工作。

Block Range Granules

Block Range Granules是绝大多数并行操作的基本单元,甚至在分区表上也是如此。因此,从ORACLE数据库角度来讲,DOP与分区数量无关。

Block range granules是一个表的物理块组。运行时数据库会计算granule的数量和大小,以便优化和平衡并行服务器间的分派工作。granule的数量和大小,依赖于对象的大小和DOP。Block range granules不依赖于表或索引的静态预分配。在granule计算过程中,数据库会考虑DOP,将不同数据文件的granule分发给每一个并行服务器,尽量避免竞争。另外,数据库还会考虑MPP(大规模并行处理,massive parallel processing)系统的granule亲和力,以便利用并行服务器和磁盘之间的物理接近。

Partition Granules

当使用分区granule时,一个并行服务器进程会工作于表或索引中的某一个分区或子分区。因为分区granule是由表或索引的物理结果静态决定的,分区granule没有象block granule一样的灵活性。最大允许的DOP就是分区数量。这可能限制了系统资源的有效利用和并行服务器间的负载均衡。

当使用分区granule并行存取表或索引时,你应该使用数量比较多的分区(理想情况下是3倍的DOP)。这样数据库才能有效均衡各个并行服务器的工作。

并行索引扫描、两个对等分区表(equipartitioned tables)之间的partition-wise关联、以及并行修改分区表,都是以分区granule为基本单元。还包括分区索引、分区表的并行创建。

你可以通过观察执行计划来判断使用哪一种granule。表或索引存取上方的PX BLOCK ITERATOR意味着block range granules的使用。下面例子的第7行可以看到:

技术分享

当使用分区granule时,你可以在表或索引存取上方看到PX PARTITION RANGE。在下面例子的第6行,你可以看到PX PARTITION RANGE ALL(这个语句读取了这个表的全部16个分区)。如果没有读取所有分区,它只会显示PX PARTITION RANGE。

技术分享

8、并行中的负载均衡

为了最优化性能,每个并行服务器应该有相同的工作量。对于以block range方式并行运行的SQL语句,工作量是动态分配给各个并行服务器上的。这最大程度上减少了工作分配不均。

对于以PARTITION RANGE方式并行运行的SQL语句,如果能够在各个分区之间平均分配工作(并行服务器数量等于分区数量,或者设置分区数量是DOP的倍数),将会最大化性能。

举例来说,一个表有16个分区,准备执行一个并行操作。如果你选择16个并行服务器(DOP=16)来完成这个工作,则只需要原来一个进程所需时间的十分之一。你也可以选择5个服务器进程,则只需要五分之一的时间;选择2个服务器,则只需要原来时间的二分之一。

然而,当你选择15个并行服务器进程后,第一个服务器进程扫描完第一个分区后接着扫描第16个分区;而其它15个进程扫描完各自的第一个分区后就都闲着啦。这种方式不能提供一个好的性能。

所以说,选择一个合适的DOP,你可以最小化工作分配不均,同时最优化系统性能。

9、rac环境中的并行

缺省情况下,RAC环境中并行SQL语句会在集群中所有节点上运行。这种情况下,必须考虑节点间的互通性,因为节点间并行执行会导致大量的互通阻塞。如果同IO带宽相比,节点间互通带宽比较低,则需考虑将并行操作限制在单节点上或部分节点上。

通过PARALLEL_FORCE_LOCAL参数来限制节点间并行操作。如果设置为TRUE,则数据库会将并行操作限制在SQL语句发布的那个节点上。

限制可用实例数量

RAC环境中,service可以被用来限制参与并行执行的实例数量。缺省service包含所有实例。你可以创建一些service,每个service中包括一个或多个实例。并行服务器就可以在指定service中的实例上运行。

Oracle“并行执行”之一——How to work

标签:数据库操作   仓库   execution   

人气教程排行