并行查询--dba手册

Posted yangeoooo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并行查询--dba手册相关的知识,希望对你有一定的参考价值。

22.8 并行查询

22.8.1 并行查询概念

倘若没有并行查询技术,一个串行执行的查询语句只能利用 CPU 或者磁盘设备中的一
个,而不能利用整个计算机的处理能力。并行查询技术的出现,使得单个 SQL 语句能利用
多个 CPU 和磁盘设备的处理能力。其优势在于可以通过多个线程来处理查询任务,从而提
高查询的效率。
达梦数据库为具有多个 CPU 的数据库服务器提供并行查询的功能,以优化查询任务的
性能。数据库服务器只有具有多个 CPU,才能使用并行执行查询操作,来提高查询任务的速
度。
达梦数据库通过三个步骤来完成并行查询:首先,确定并行任务数;其次,确定并行工
作线程数;最后,执行查询。并行查询相关参数见下表:
表 22.1 并行查询相关参数

参数名缺省值属性说明
MAX_PARALLEL_DEGREE1动态,会话级用来设置默认并行任务个数。取值范围:1~128。缺省值 1,表示无并行任务。当 PARALLEL_POLICY 值为 1 时该参数值才有效。
PARALLEL_POLICY0静态用来设置并行策略。取值范围:0、1 和 2,缺省为 0。其中,0 表示不支持并行;1 表示自动并行模式;2 表示手动并行模式。
PARALLEL_THRD_NUM10静态用来设置并行工作线程个数。取值范围:1~1024。

22.8.2 确定并行任务个数

当开启自动并行(PARALLEL_POLICY=1)时,参数 MAX_PARALLEL_DEGREE 生效,
控制并行查询最多使用的线程数。MAX_PARALLEL_DEGREE 缺省值为 1,表示不并行。此
时若指定参数对应的 HINT “PARALLEL”,则使用 HINT 值;
当开启手动并行(PARALLEL_POLICY=2)时,参数 MAX_PARALLEL_DEGREE 失效,
用户需要在语句中使用此参数对应的 HINT “PARALLEL”指定语句的并行度,否则不并行。
1. 在 INI 参数中设置默认值
INI 参数 MAX_PARALLEL_DEGREE 设置最大并行任务个数。取值范围:1~128。缺省
值 1,表示无并行任务,此参数仅在 PARALLEL_POLICY 值为 1 时才有效。
例如,在 INI 参数中将 MAX_PARALLEL_DEGREE 设置为 3 的格式如下:
MAX_PARALLEL_DEGREE 3
然后,使用一般的 SQL 语句查询即可执行并行查询,不需要使用 HINT。如:
SELECT * FROM SYSOBJECTS;
2. 在 SQL 语句中使用“PARALLEL”关键字特别指定
当 PARALLEL_POLICY=2 时,需要在 SQL 语句中通过“PARALLEL”HINT 指定并行
度,否则不并行。若 PARALLEL_POLICY=1,则 SQL 语句中使用的“PARALLEL”HINT
总是优先于 MAX_PARALLEL_DEGREE 参数设置。
―PARALLEL‖关键字的用法是在数据查询语句的 SELECT 关键字后,增加 HINT 子句
来实现。
HINT 语法格式如下:
/*+ PARALLEL([<表名>] <并行任务个数>) /
例如,下面的例子中,即使已经设置了 MAX_PARALLEL_DEGREE 默认值 3,但实际使
用的为 PARALLEL 指定的任务个数 4:
SELECT /
+ PARALLEL(4) / * FROM SYSOBJECTS;
另外,每个语句中仅能设置一次并行任务个数,如果设置了多次,则以最后一次设置为
准,而且任务个数在全语句中生效。
例如,下面的例子中,使用的并行任务个数为 2。
SELECT /
+ PARALLEL(1) //+ PARALLEL(2) */ * FROM SYSOBJECTS;
这种方式能够为单条查询语句设置额外的并行任务个数,以此来提高某些特殊查询任务
的性能。

22.8.3 确定并行工作线程数

在执行并行查询任务之前,您需要指定完成该任务的并行工作线程数。值得注意的是,
实际使用的线程数并非总是等于并行工作线程数。并行工作线程数是在 INI 参数中设定的,
实际使用并行工作线程数是根据系统的实际状况确定的。
1. 并行工作线程数,在 INI 参数中设定
首先,使用 PARALLEL_POLICY 参数来设置并行策略。取值范围:0、1 和 2,默认值
0。其中,0 表示不支持并行;1 表示自动并行模式;2 表示手动并行模式。
当开启本地并行(PARALLEL_POLICY>0)时,使用 PARALLEL_THRD_NUM 指定本地
并行查询使用的线程数,取值范围为 1~1024,缺省值为 10。需要注意的是,若
PARALLEL_POLICY=1,如果 PARALLEL_THRD_NUM=1, 则按照 CPU 个数创建并行线程。
例如,设置并行策略 PARALLEL_POLICY 为 2,即手动设置并行工作线程数;同时,
设置并行工作线程数 PARALLEL_THRD_NUM 为 4 个。
PARALLEL_POLICY 2
PARALLEL_THRD_NUM 4
当然,并非所有的查询都适合使用并行查询。大量占用 CPU 周期的查询最适合采用并
行查询的功能。例如,大型表的连接查询、大量数据的聚合和大型结果集的排序等都很适合
采用并行查询。对于简单查询(常用于事务处理应用程序)而言,执行并行查询所需的额外
协调工作会大于潜在的性能提升。所以,数据库管理员在确定是否需要使用并行策略的时候,
需要慎重。
2. 实际使用的线程数,达梦数据库会根据每个并行查询操作自动检测
实际使用线程数是数据库在查询计划执行时初始化的时候确定的。也就是说,这不需要
用户去干预,而是系统根据并行任务数和实际空闲的并行工作线程数来确定的。此操作所依
据的条件如下:首先,检测达梦数据库是否运行在具有多个CPU的计算机上。只有具有多个
CPU 的计算机才能使用并行查询。这是一个硬性的限制条件。其次,检测可用的空闲工作
线程是否足够。并行查询到底采用多少线程数,除了跟操作的复杂程度相关外,还跟当时的
服务器状态相关,如是否有足够的可用的空闲工作线程数量等。每个并行查询操作都要求一
定的工作线程数量才能够执行;而且执行并行计划比执行串行计划需要更多的线程,所需要
的线程数量也会随着任务个数的提高而增加。当无法满足特定并行查询执行的线程要求时,
数据库引擎就会自动减少任务个数,甚至会放弃并行查询而改为串行计划。所以,即使同一
个操作在不同时候可能会采用不同的线程数。
例如,即使设置并行工作线程数为4。而实际使用的线程数可能只有3个,或者更少。

22.8.4 执行查询

当以上内容确定好之后,数据库就会执行具体的查询任务。

22.8.5 使用场景

使用手动并行模式时,只需要在 INI 参数中设置好如下 2 个参数,然后执行并行 SQL
查询语句时,需手动指定当前并行任务个数。若不指定,将不使用并行。设置的 2 个参数
如下:
PARALLEL_POLICY 2
PARALLEL_THRD_NUM 4
使用自动并行模式时,一般指定如下三个参数:
MAX_PARALLEL_DEGREE 3
PARALLEL_POLICY 1
PARALLEL_THRD_NUM 10
另外,当 PARALLEL_POLICY 为 0 时,即使有并行任务,也不支持并行。
然后,执行语法格式类似―SELECT * FROM SYSOBJECTS;‖的并行 SQL 语句即可,
本条语句使用默认并行任务数 3。
当然,如果单条查询语句不想使用默认并行任务数,可以通过在 SQL 语句中增加 HINT,
通过―PARALLEL‖关键字来特别指定。此时,执行的并行 SQL 语句格式为―SELECT /*+
PARALLEL(SYSOBJECTS 4) */ * FROM SYSOBJECTS;‖,本条语句使用的并行任务数
为 4。

以上是关于并行查询--dba手册的主要内容,如果未能解决你的问题,请参考以下文章

DBA日常工作

并行查询工作线程陷入死锁

DBA的五款最佳SQL查询优化工具

用户级别的最大并行度 (MAXDOP)

MySQL查询优化器工作原理解析

MySQL查询优化器工作原理解析