以下操作始终是并行受限的。
在相同的手册页:上继续下去
类似地,如果函数访问临时表、客户端连接状态、游标、准备语句或系统无法跨工作人员同步的杂项后端本地状态,则必须标记为
PARALLEL RESTRICTED。例如,由于最后一个原因,setseed和random是并行受限的。
没有提到CTE。现在,我不确定是否可以将PARALLEL SAFE用于包含CTE的函数。对我来说,只有PARALLEL RESTRICTED才是有意义的。
上下文:我必须为现有的用户定义函数确定最佳标签。这个设置是新的,因为Postgres 9.6会对性能产生巨大的影响,因为涉及非PARALLEL SAFE的函数的操作不会由并行工作人员执行,而只由领导者执行PARALLEL RESTRICTED。( PARALLEL USAFE完全禁用并行性。)
我发布了一个相关的关于pgsql-通用的问题。
发布于 2019-10-17 06:21:53
如果函数包含使用CTE的查询,并且该函数由并行工作进程使用,则查询和CTE将仅在并行工作者的私有进程上下文中执行。在创建或扫描该CTE时不涉及共享状态。
因此,对函数PARALLEL SAFE进行标记是安全的。
文档中的引文指出,应该并行化的查询中定义的CTE只能由领导流程扫描,而不能由并行工作人员扫描,这正是因为CTE不能在进程之间共享。这对运行在并行工作人员调用的函数中的查询中定义的CTE没有影响,因为这样的嵌套查询无论如何不会被并行化。:
即使在通常可能生成并行查询计划的情况下,如果下列任何一项都是正确的,规划者也不会为给定的查询生成它们:
https://dba.stackexchange.com/questions/251274
复制相似问题