Erw*_*ter 5 postgresql parallelism functions
以下操作始终受到并行限制。
- 扫描公共表表达式 (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 没有影响,因为此类嵌套查询无论如何都不会并行化:
即使通常可以生成并行查询计划,如果满足以下任一条件,规划器也不会为给定查询生成它们:
[...]
- 该查询正在另一个已经并行的查询内部运行。例如,如果并行查询调用的函数本身发出 SQL 查询,则该查询将永远不会使用并行计划。