开启并行查询
系统参数及状态变量说明
- 支持的系统参数如表1。
表1 系统参数 参数名称
级别
描述
force_parallel_execute
Global, Session
是否开启并行查询。当设置为“ON”时,表示查询SQL尽可能地使用并行执行;设置为“OFF”时,关闭并行查询优化。内核2.0.60.241200版本之后,支持“AUTO”选项,设置为“AUTO”系统会对默认的一些场景使用并行查询优化,对应场景是由pq_support_features_switch参数控制。
- 取值范围:ON, OFF, AUTO
- 默认值:OFF
pq_master_enable
Global
是否在主机开启并行查询,需要与参数force_parallel_execute配合使用,设置为“ON”时,如果force_parallel_execute为ON或AUTO,并行查询在主机生效;设置为"OFF"时,表示并行查询在主机不生效。只读节点不受该参数影响。
- 取值范围:ON, OFF
- 默认值:ON
parallel_max_threads
Global
并行执行的最大活跃线程个数。当并行执行的活跃线程超过该值时,新的查询将不允许启用并行执行。
- 取值范围:0-4294967295
- 默认值:64
parallel_default_dop
Global, Session
并行执行的默认并行度。当查询语句没有指定并行度时,使用该值。
- 取值范围:0-1024
- 默认值:4
parallel_cost_threshold
Global, Session
启用并行执行的代价阈值。只有当查询的执行代价超过该阈值时才有可能进行并行执行。
- 取值范围:0-4294967295
- 默认值:1000
parallel_queue_timeout
Global, Session
当不满足并行查询的条件时,请求并行执行的SQL等待超时时间。当等待时间超过该值后,则不再等待,开始进行单线程执行。
- 取值范围:0-4294967295
- 默认值:0
parallel_memory_limit
Global
并行执行可用的内存上限。当并行执行使用的内存量超过该值时,新的SQL查询将不会进行并行执行。
- 取值范围:0-4294967295
- 默认值:104857600
parallel_setup_cost
Global, Session
启动初始化并行执行的代价。用于估算并行执行的总代价。
- 取值范围:0-1000000000
- 默认值:1000
parallel_tuple_cost
Global, Session
并行执行消息传递单条记录的代价。用于估算并行执行的总代价。
- 取值范围:0-1000000
- 默认值:1.5
- 支持的状态变量如表2。
开启并行查询
支持通过设置系统参数和使用HINT语法两种方式,开启或关闭并行查询。
- 方法一:通过设置系统参数开启或关闭并行查询
在管理控制台的参数修改页面,通过设置系统参数,可以全局开启或关闭并行查询,并调整并行度。
通过参数“force_parallel_execute”控制是否强制启用并行执行。
通过参数“pq_master_enable”控制主机是否开启并行查询。
通过参数“parallel_default_dop”控制使用多少线程并行执行。
通过参数“parallel_cost_threshold”来控制启动并行查询的代价阈值,默认值为1000,不建议将该值设置的过小,因为简单查询不适合使用并行查询。
上述参数在使用过程中,支持动态修改,无需重启数据库。
也支持会话内修改并行查询并发度,修改启动并行查询的代价阈值,例如将并发度调整为8,最小执行代价调整为100,可参照如下进行设置:
SET parallel_default_dop=8; SET parallel_cost_threshold=100;
- 方法二:使用HINT开启或关闭并行查询
使用HINT语法可以控制单个语句是否进行并行执行。在系统默认关闭并行执行的情况下, 可以使用hint对特定的SQL进行开启。反之,也可以禁止某条SQL进行并行执行。
开启并行执行:采用下面的HINT语法可以开启并行执行。
采用默认的参数配置:SELECT /*+ PQ() */ … FROM …
采用默认的参数配置,同时指定并发度为8:SELECT /*+ PQ(8) */ … FROM …
采用默认的参数配置,同时指定并行表为t1:SELECT /*+ PQ(t1) */ … FROM …
采用默认的参数配置,同时指定并行表为t1,并发度为8:SELECT /*+ PQ(t1 8) */ … FROM …
PQ HINT紧跟着SELECT关键字才能生效。PQ HINT的并发度参数dop正常取值范围[1, min(parallel_max_threads, 1024)]。
dop超出正常取值范围时,PQ不生效。
关闭并行执行:当并行查询开启时,可使用"NO_PQ"的hint语法关闭单条SQL的并行执行。
SELECT /*+ NO_PQ */ … FROM …
NO_PQ hint的优先级高于PQ hint,如果SQL语句出现NO_PQ hint,即使配置PQ hint,该单条SQL也不会并行执行。