首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时将函数标记为并行受限的还是并行安全的?

何时将函数标记为并行受限的还是并行安全的?
EN

Database Administration用户
提问于 2019-10-16 17:32:03
回答 1查看 2.1K关注 0票数 7

Postgres手册12说:

以下操作始终是并行受限的。

  • 扫描公共表表达式(CTE)。
  • 临时表的扫描。
  • ..。

在相同的手册页:上继续下去

类似地,如果函数访问临时表、客户端连接状态、游标、准备语句或系统无法跨工作人员同步的杂项后端本地状态,则必须标记为PARALLEL RESTRICTED。例如,由于最后一个原因,setseedrandom是并行受限的。

没有提到CTE。现在,我不确定是否可以将PARALLEL SAFE用于包含CTE的函数。对我来说,只有PARALLEL RESTRICTED才是有意义的。

上下文:我必须为现有的用户定义函数确定最佳标签。这个设置是新的,因为Postgres 9.6会对性能产生巨大的影响,因为涉及非PARALLEL SAFE的函数的操作不会由并行工作人员执行,而只由领导者执行PARALLEL RESTRICTED。( PARALLEL USAFE完全禁用并行性。)

我发布了一个相关的关于pgsql-通用的问题

EN

回答 1

Database Administration用户

回答已采纳

发布于 2019-10-17 06:21:53

如果函数包含使用CTE的查询,并且该函数由并行工作进程使用,则查询和CTE将仅在并行工作者的私有进程上下文中执行。在创建或扫描该CTE时不涉及共享状态。

因此,对函数PARALLEL SAFE进行标记是安全的。

文档中的引文指出,应该并行化的查询中定义的CTE只能由领导流程扫描,而不能由并行工作人员扫描,这正是因为CTE不能在进程之间共享。这对运行在并行工作人员调用的函数中的查询中定义的CTE没有影响,因为这样的嵌套查询无论如何不会被并行化。

即使在通常可能生成并行查询计划的情况下,如果下列任何一项都是正确的,规划者也不会为给定的查询生成它们:

  • 该查询正在另一个已经并行的查询中运行。例如,如果由并行查询调用的函数发出SQL查询本身,则该查询将永远不会使用并行计划。
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/251274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档