# 15.4.平行安全

15.4.1. 函数和集合的并行标记

计划者将查询中涉及的操作分类为平行保险箱,并行限制平行不安全.并行安全操作是与并行查询的使用不冲突的操作。并行受限操作是指不能在并行工作程序中执行的操作,但可以在使用并行查询时在前导程序中执行的操作。因此,并行受限操作永远不会发生在聚集聚集合并节点,但可以出现在包含此类节点的计划中的其他位置。并行不安全操作是在使用并行查询时无法执行的操作,即使在领导者中也不行。当查询包含任何并行不安全的内容时,该查询将完全禁用并行查询。

以下操作始终受到并行限制:

  • 扫描常用表表达式(CTE)。

  • 扫描临时表。

  • 扫描外部表,除非外部数据包装器具有外国人安全吗API,则表明情况并非如此。

  • 计划要将初始计划附件。

  • 计划引用相关节点的节点子计划.

# 15.4.1.函数和集合的并行标记

规划者无法自动确定用户定义的函数或聚合是并行安全、并行受限还是并行不安全,因为这需要预测函数可能执行的每个操作。一般来说,这相当于停顿问题,因此是不可能的。即使对于可以想象得到的简单函数,我们也不尝试,因为这样做成本高昂且容易出错。相反,除非另有标记,否则所有用户定义的函数都假定为并行的不安全函数。使用时创建函数改变功能,标记可以通过指定平行保险箱, 并行限制平行不安全视情况而定。使用时创建聚合这个平行的选项可以用指定安全, 受限制的不安全的作为相应的值。

必须标记功能和集合平行不安全如果它们写入数据库、访问序列,甚至可以临时更改事务状态(例如,建立例外块以捕获错误),或对设置进行持续更改。同样,必须标记函数并行限制如果他们访问临时表、客户端连接状态、游标、准备好的语句或系统无法跨工作线程同步的其他后端本地状态。例如种子随机的由于最后一个原因,我们限制了并行。

一般来说,如果函数在被限制或不安全时被标记为安全,或者在实际上不安全时被标记为受限制,则在并行查询中使用时可能会抛出错误或产生错误答案。理论上,C语言函数如果标记错误,可能会表现出完全未定义的行为,因为系统无法保护自己免受任意C代码的攻击,但在大多数情况下,结果不会比任何其他函数更糟。如果有疑问,最好将函数标记为不安全的.

如果在并行工作程序中执行的函数获取了不由领导者持有的锁,例如通过查询查询中未引用的表,这些锁将在工作程序退出时释放,而不是在事务结束时释放。如果你编写了一个函数来实现这一点,并且这种行为差异对你来说很重要,那么将这些函数标记为并行限制确保他们只在领导者中执行。

注意,查询规划者不考虑推迟对查询中涉及的并行受限函数或聚集的评价,以获得优越的计划。例如,如果哪里应用于特定表的子句是平行受限制的,查询规划者不会考虑在计划的并行部分中执行该表的扫描。在某些情况下,在查询的并行部分包括对该表的扫描,并推迟对该表的计算是可能的(甚至可能是有效的)哪里子句,使其发生在聚集节点。然而,规划者并没有这样做。