1 并行查询概念
并行查询技术可以使单个 SQL 语句能利用多个 CPU 和磁盘设备的处理能力,可以通过多个线程来处理查询任务,从而提高查询的效率。
达梦数据库为具有多个 CPU 的数据库服务器提供并行查询的功能,以优化查询任务的性能。数据库服务器只有具有多个 CPU,才能使用并行执行查询操作,来提高查询任务的速度。
2 确定并行任务个数
当开启自动并行(PARALLEL_POLICY=1)时,参数 MAX_PARALLEL_DEGREE 生效,控制并行查询最多使用的线程数。MAX_PARALLEL_DEGREE 缺省值为 1,表示不并行。此时若指定参数对应的 HINT “PARALLEL”,则使用 HINT 值;
当开启手动并行(PARALLEL_POLICY=2)时,参数 MAX_PARALLEL_DEGREE失效,用户需要在语句中使用此参数对应的 HINT “PARALLEL”指定语句的并行度,否则不并行。
2.1 在ini参数中设置默认值
INI 参数 MAX_PARALLEL_DEGREE 设置最大并行任务个数。取值范围:1~128。缺省值 1,表示无并行任务,此参数仅在 PARALLEL_POLICY 值为 1 时才有效。
重启Dm
使用一般的 SQL 语句查询即可执行并行查询,不需要使用 HINT。也可以走执行计划:
2.2 在 SQL 语句中使用“PARALLEL”关键字特别指定
当 PARALLEL_POLICY=2 时,需要在 SQL 语句中通过“PARALLEL”HINT 指定并行度,否则不并行。
若 PARALLEL_POLICY=1,则 SQL 语句中使用的“PARALLEL”HINT总是优先于 MAX_PARALLEL_DEGREE 参数设置。“PARALLEL”关键字的用法是在数据查询语句的 SELECT 关键字后,增加 HINT 子句来实现。
在之前已经设置了 MAX_PARALLEL_DEGREE 默认值 4,但实际使用的为 PARALLEL 指定的任务个数 3:
另外,每个语句中仅能设置一次并行任务个数,如果设置了多次,则以最后一次设置为准,而且任务个数在全语句中生效。
例如,使用的并行任务个数为 2。
3 确定并行工作线程数
在执行并行查询任务之前,需要指定完成该任务的并行工作线程数。实际使用的线程数并非总是等于并行工作线程数。并行工作线程数是在 INI 参数中设定的,实际使用并行工作线程数是根据系统的实际状况确定的。
3.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 个数创建并行线程。
3.2 实际使用的线程数,达梦数据库会根据每个并行查询操作自动检测
实际使用线程数是数据库在查询计划执行时初始化的时候确定的。也就是说,这不需要用户去干预,而是系统根据并行任务数和实际空闲的并行工作线程数来确定的。
首先,检测达梦数据库是否运行在具有多个CPU的计算机上。只有具有多个CPU 的计算机才能使用并行查询。这是一个硬性的限制条件。
其次,检测可用的空闲工作线程是否足够。并行查询到底采用多少线程数,除了跟操作的复杂程度相关外,还跟当时的服务器状态相关,如是否有足够的可用的空闲工作线程数量等。每个并行查询操作都要求一定的工作线程数量才能够执行;而且执行并行计划比执行串行计划需要更多的线程,所需要的线程数量也会随着任务个数的提高而增加。当无法满足特定并行查询执行的线程要求时,数据库引擎就会自动减少任务个数,甚至会放弃并行查询而改为串行计划。所以,即使同一个操作在不同时候可能会采用不同的线程数。
例如,即使设置并行工作线程数为4。而实际使用的线程数可能只有3个,或者更少。
推荐使用达梦的云适配中心网站了解更多使用内容:https://eco.dameng.com,或者到云适配中心的社区去提问哦!