签到成功

知道了

CNDBA社区CNDBA社区

Orcle 12c 新特性---Enhanced Parallel Statement Queuing

2017-08-30 09:16 3344 0 原创 Oracle 12C
作者: Expect-乐

说明

官方文档: degree of parallelism (DOP)

http://docs.oracle.com/database/121/VLDBG/GUID-4A311C0C-8ABC-4E5A-A854-19F04DACBC36.htm#VLDBG1396

Enhancing parallel statement queuing provides more flexibility to address business requirements for mission-critical environments.

增强并行语句队列提供了更多的灵活性,以满足任务关键环境的业务需求。

When the parameter PARALLEL_DEGREE_POLICY is set to AUTO, Oracle Database queues SQL statements that require parallel execution if the necessary number of parallel execution server processes are not available. After the necessary resources become available, the SQL statement is dequeued and allowed to execute. The default dequeue order is a simple first in, first out queue based on the time a statement was issued.http://www.cndba.cn/Expect-le/article/2192

下图是SQL并行执行的流程图:

1.  解析SQL并自动决定DOP(degree of parallelism)

2.  检查是否有足够的并行资源(PARALLEL_SERVERS_TARGET当前环境默认值16)--不能超过PARALLEL_MAX_SERVERS大小

a.  如果有(可用并行资源大于当前SQL所需的),并且前面没有正在执行的SQL,那么就会执行该SQL

b.  如果没有(可用并行资源小于当前SQL所需的),则会排队等待有足够的资源来执行该SQL


 

如果发生语句排队等待现象,那么会以等待事件:resmgr:pq queued表现出来。

http://www.cndba.cn/Expect-le/article/2192

使用hint管理Parallel Statement Queuing

PARALLEL_DEGREE_POLICY AUTO情况下,使用NO_STATEMENT_QUEUING STATEMENT_QUEUING来影响语句是否使用Parallel Statement Queuing队列。http://www.cndba.cn/Expect-le/article/2192http://www.cndba.cn/Expect-le/article/2192

2.1   NO_STATEMENT_QUEUING

使用NO_STATEMENT_QUEUING会使语句绕过parallel statement queue。但是这可能会超过PARALLEL_SERVERS_TARGET指定的最大并行执行数。http://www.cndba.cn/Expect-le/article/2192

如:

http://www.cndba.cn/Expect-le/article/2192

SELECT /*+ NO_STATEMENT_QUEUING */ last_name, department_name
  FROM employees e, departments d
  WHERE e.department_id = d.department_id;

2.2   STATEMENT_QUEUING

STATEMENT_QUEUING HINTSQL语句使用parallel statement queue,但是只有在可以在并行进程足够的时才运行。在启用队列之前,可用的并行执行服务器的数量等于在使用的并行执行服务器数量和系统中允许的最大数量之间的差,是有PARALLEL_SERVERS_TARGET参数定义的。

如:

SELECT /*+ STATEMENT_QUEUING */ last_name, department_name
  FROM employees e, departments d
  WHERE e.department_id = d.department_id;

PARALLEL_SERVERS_TARGET设置

PARALLEL_SERVERS_TARGET参数默认值不是固定不变的,而是有公式计算而来的。

公式:PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 2

如:当前我的环境

PARALLEL_THREADS_PER_CPU = 2

SQL> show parameter PARALLEL_THREADS_PER_CPU
NAME	     TYPE	VALUE
------------------------------------ ----------------------
parallel_threads_per_cpu	     integer	2

http://www.cndba.cn/Expect-le/article/2192


CPU_COUNT = 1

SQL> show parameter CPU_COUNT
NAME	     TYPE	VALUE
------------------------------------ ----------------------
cpu_count	     integer	1

http://www.cndba.cn/Expect-le/article/2192

concurrent_parallel_users参数值分为三种情况:

http://www.cndba.cn/Expect-le/article/2192

1.  如果设置了MEMORY_TARGETSGA_TARGET,那么concurrent_parallel_users=4

2.  如果没有设置MEMORY_TARGETSGA_TARGET,并且也设置了PGA_AGGREGATE_TARGE的大小,那么concurrent_parallel_users=2

3.  如果没有设置PGA_AGGREGATE_TARGE的大小,那么concurrent_parallel_users=1

当前环境:属于第一种情况,设置了MEMORY_TARGET,因为没有设置PGA_AGGREGATE_TARGET。所以不满足第二章情况

SQL> show parameter MEMORY_TARGET
NAME	     TYPE	    VALUE
------------------------------------ ---------------------- ------------------------------
memory_target	     big integer	    1G

SQL> show parameter SGA_TARGET
NAME	     TYPE	    VALUE
------------------------------------ ---------------------- ------------------------------
sga_target	     big integer	    0

SQL> show parameter PGA_AGGREGATE_TARGET
NAME	     TYPE	    VALUE
------------------------------------ ---------------------- ------------------------------
pga_aggregate_target	     big integer	    0

SQL> show parameter PARALLEL_SERVERS_TARGET
NAME	     TYPE	    VALUE
------------------------------------ ---------------------- ------------------------------
parallel_servers_target      integer	    16

http://www.cndba.cn/Expect-le/article/2192

所以,PARALLEL_SERVERS_TARGET= 2 * 1 *4 * 2 = 16和查询出来的结果一致。

3.1   修改参数值

只能在CDB中的system级别修改,大小0PARALLEL_MAX_SERVERS之间,重启生效

SQL> alter system set parallel_servers_target = 17 scope = spfile;
System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size	    8801008 bytes
Variable Size	 1023411472 bytes
Database Buffers	   37748736 bytes
Redo Buffers	    3780608 bytes
Database mounted.
Database opened.

SQL> show parameter PARALLEL_SERVERS_TARGET
NAME	     TYPE	    VALUE
------------------------------------ ---------------------- ------------------------------
parallel_servers_target      integer	    17

更多详细信息参考:

http://www.360doc.com/content/15/0720/16/17511907_486228638.shtml

http://docs.oracle.com/database/121/VLDBG/GUID-4A311C0C-8ABC-4E5A-A854-19F04DACBC36.htm#VLDBG1396

http://docs.oracle.com/database/121/VLDBG/GUID-91782768-B249-43E1-B8D5-943C68B1459F.htm

版权声明:本文为博主原创文章,未经博主允许不得转载。

Parallel Statement Queuing

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Expect-乐

Expect-乐

关注

Without the continuous bitter cold, there can be no fragrant plum blossom

  • 336
    原创
  • 6
    翻译
  • 100
    转载
  • 41
    评论
  • 访问:1552811次
  • 积分:1957
  • 等级:核心会员
  • 排名:第4名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ