# 15.2.什么时候可以使用并行查询?

有几种设置可能会导致查询计划器在任何情况下都不会生成并行查询计划。为了生成任何并行查询计划,必须按照指示配置以下设置。

  • 最大值_平行的_工人_每_聚集必须设置为大于零的值。这是更一般原则的特例,即不应使用超过通过配置的数量的工人每个聚集的最大平行工人数.

    此外,系统不得以单用户模式运行。由于在这种情况下,整个数据库系统在单个进程中运行,因此没有后台工作人员可用。

    即使通常可以生成并行查询计划,如果满足以下任一条件,计划者也不会为给定查询生成计划:

  • 查询会写入任何数据或锁定任何数据库行。如果查询包含顶层或CTE内的数据修改操作,则不会为该查询生成并行计划。作为例外,以下创建并填充新表的命令可以对基础表使用并行计划选择部分问题:

    • 创建表格。。。像

    • 选择进入

    • 创建物化视图

    • 刷新物化视图

  • 查询可能在执行期间暂停。在系统认为可能发生部分或增量执行的任何情况下,都不会生成并行计划。例如,使用声明游标永远不会使用平行计划。类似地,以下形式的PL/pgSQL循环对于查询循环中的x。。端环永远不会使用并行计划,因为并行查询系统无法验证在并行查询处于活动状态时循环中的代码是否可以安全执行。

  • 查询使用任何标记为平行不安全.大多数系统定义的功能是平行保险箱,但会标记用户定义的函数平行不安全默认情况下。参见对第15.4节.

  • 查询正在另一个已经并行的查询中运行。例如,如果并行查询调用的函数本身发出SQL查询,则该查询永远不会使用并行计划。这是当前实现的一个限制,但可能不希望删除此限制,因为它可能导致使用大量进程的单个查询。

    即使为特定查询生成并行查询计划,也有几种情况下无法在执行时并行执行该计划。如果发生这种情况,领导将执行计划中低于聚集节点完全独立,几乎就像聚集淋巴结不存在。如果满足以下任何条件,就会发生这种情况:

  • 由于背景工作人员总数不能超过的限制,无法获得背景工作人员最大值_工人_过程.

  • 无法获取后台工作人员,因为为并行查询目的启动的后台工作人员总数不能超过最大值_平行的_工人.

  • 客户机发送一条执行消息,其获取计数为非零。参见对扩展查询协议自从libpq目前没有提供发送此类消息的方法,这只能在使用不依赖libpq的客户端时发生。如果这是一个经常发生的情况,那么设置最大值_平行的_工人_每_聚集在可能的会话中设置为零,以避免生成串行运行时可能不理想的查询计划。