以下操作始终受到并行限制。
- 公用表表达式 (CTE) 的扫描。
- 扫描临时表。
- ...
在同一手册页的下方:
PARALLEL RESTRICTED
[...] 类似地,如果函数访问临时表、客户端连接状态、游标、预准备语句或系统无法跨工作器同步的杂项后端本地状态,则必须标记函数。例如,setseed
并且random
由于最后一个原因而受到并行限制。
没有提到 CTE。现在我不确定我是否可以PARALLEL SAFE
用于包含 CTE 的函数。对我来说,只有那些是有意义的PARALLEL RESTRICTED
。
上下文:我必须确定现有用户定义函数的最佳标签。该设置是自 Postgres 9.6 以来的新设置,并且可能对性能产生巨大影响,因为涉及非并行工作者的操作PARALLEL SAFE
不会由并行工作人员执行,而PARALLEL RESTRICTED
只能由领导者执行。(并PARALLEL USAFE
完全禁用并行性。)
我在 pgsql-general 上发布了一个相关问题。
如果函数包含使用 CTE 的查询,并且该函数由并行工作进程使用,则查询和 CTE 将仅在并行工作人员的私有进程上下文中执行。创建或扫描该 CTE 不涉及共享状态。
所以标记函数是安全的
PARALLEL SAFE
。文档中的引文说,在查询中定义的应该并行化的 CTE 只能由领导进程扫描,而不能由并行工作人员扫描,正是因为 CTE 在进程之间不共享。这对在并行工作者调用的函数中运行的查询中定义的 CTE 没有影响,因为这样的嵌套查询无论如何都不会被并行化: