PostgreSQL 中写入操作的 CTE 并行查询

2023-12-22

From PostgreSQL 9.6 发行说明 https://www.postgresql.org/docs/9.6/static/release-9-6.html#AEN130398:

只有通过顺序扫描访问驱动表的严格只读查询才能并行化。

我的问题是:如果 CTE (WITH子句)仅包含读取操作,但其结果用于提供写入操作,例如插入或更新,是否也不允许并行顺序扫描?

我的意思是,CTE 很像仅针对当前正在执行的查询而存在的临时表,我可以假设它的内部查询可以利用 PostgreSQL 9.6 的全新并行 seq-scan 吗?或者,否则,它是否被视为using子查询不能并行扫描?

例如,考虑以下查询:

WITH foobarbaz AS (
  SELECT foo FROM bar
  WHERE some_expensive_function(baz)
)
DELETE FROM bar
USING foobarbaz
WHERE bar.foo = foobarbaz.foo
;

foob​​arbaz 计算是否期望能够并行化,或者是否因为删除语句而被禁止?

如果不允许,我认为可以用创建临时表陈述。但我想我会陷入同样的​​问题创建表是一个写操作。我错了吗?

最后,我可以尝试的最后一次机会是将其作为纯读取操作执行,并将其结果用作插入和/或更新操作的输入。在事务之外它应该可以工作。但问题是:如果读操作和插入/更新之间是begin and commit句子,无论如何都不会被允许吗?我知道它们是两个完全不同的操作,但是在同一个事务和 Postgres 中。

需要明确的是,我担心的是,我有大量难以阅读和难以重新设计的 SQL 查询,这些查询涉及使用低性能函数调用的多次顺序扫描,并对两个表执行复杂的更改。整个过程在单个事务中运行,因为如果不是这样,发生故障时的混乱将完全无法恢复。

我的希望是能够并行化一些顺序扫描,以利用机器的 8 个 cpu 核心,从而能够更快地完成该过程。

请不要回答说我需要完全重新设计这个混乱:我知道并且我正在努力解决它。但这是一个伟大的项目,我们需要在此期间继续努力。

无论如何,任何建议都会感激不尽。

EDIT:

我添加一个简短的报告,说明我目前所能发现的情况:

  • 正如 @a_horse_with_no_name 在他的评论中所说(谢谢),CTE 和查询的其余部分是单个 DML 语句,如果它有写操作,即使在 CTE 之外,那么 CTE 也无法并行化(我也测试了它) 。

  • 我还发现了这个维基页面 https://wiki.postgresql.org/wiki/Parallel_Query有关并行扫描的信息比我在发行说明链接中找到的信息更简洁。

  • 感谢该维基页面,我可以检查的一个有趣的点是我需要将所涉及的函数声明为并行安全。我做到了并工作了(在没有写作的测试中)。

  • 另一个有趣的点是 @a_horse_with_no_name 在他的第二条评论中所说的:使用 DbLink 执行纯只读查询。但是,对此进行了一些调查,我发现postgres_fdw https://www.postgresql.org/docs/9.6/static/postgres-fdw.html,在 wiki 中明确提到不支持并行扫描,使用更现代且符合标准的基础设施提供大致相同的功能 https://www.postgresql.org/docs/9.6/static/dblink.html.

    • 另一方面,即使它有效,我最终也会从交易外部获取数据,在某些情况下,这对我来说是可以接受的,但我认为,这并不像一般解决方案那么好。
  • 最后,我检查了是否可以在只读查询中执行并行扫描inside一个事务,即使它稍后执行写操作(没有触发异常并且我可以提交)。

...总而言之,我认为我最好的选择(如果不是唯一的选择)是重构脚本,使其先将数据读取到内存,然后再在同一事务中执行写入操作。

它会增加 I/O 开销,但是,考虑到我管理的延迟,效果会更好。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 中写入操作的 CTE 并行查询 的相关文章

随机推荐

  • 抱歉,处理您的请求时发生错误[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 windows azure 中
  • PhoneGap 文件删除不起作用

    我正在构建一个基本的应用程序 其中非常具有 PhoneGap 功能 因为我试图确定它可以 不能做什么 我已经到了想要删除已在应用程序上下载的文件的阶段 但它不起作用 我使用的大部分代码来自http docs phonegap com en
  • 如何求整数n次根?

    我想找到小于或等于n的k次方根的最大整数 我试过 int n 1 k 但对于 n 125 k 3 这给出了错误的答案 我碰巧知道 5 的立方是 125 gt gt gt int 125 1 3 4 有什么更好的算法 背景 2011 年 这个
  • 随机选择一个目录下的100个文档

    该目录下大约有2000个文档 我想随机选择一些文档并自动将它们复制到新目录 一些相关信息 https stackoverflow com questions 701402 best way to choose a random file f
  • ASP.NET core Web API授权属性返回404错误并强制重定向

    我有 asp net core 2 0 解决方案 其中包含以下项目 Data EF代码的类库 OAuth 作为 IdentityServer4 代码的 Web 应用程序项目 Api 用于我创建为空 Web 项目的 API 现在OAuth项目
  • 如何映射具有未知嵌套级别的数组?

    我有一个可以有答案的注释数组 因此数组的每个元素 注释 都可以有嵌套元素 注释 并且嵌套级别未知 但我需要在 ReactJs 中渲染这个数组 以使用给定的值显示这些注释嵌套级别 comment 1 comment 2 comment 3 c
  • 如何仅当上一步失败时才在 Jenkins 中运行条件步骤

    我正在尝试在詹金斯创建一个两步工作 我希望只有在第一步失败时才运行第二步 第一步执行单元测试以查看我正在编译的代码是否良好 如果不是 那么我想在第二步中运行一些诊断 有条件的阶梯插头似乎是一个不错的选择 但是 我无法弄清楚如何使用条件步骤插
  • .net core 项目依赖项 - 黄色三角形

    我的 Net Core 项目的依赖项上有一个黄色三角形 但是当我打开它时 所有子条目都没有黄色三角形 当我将鼠标悬停在依赖项上时 我没有看到任何工具提示告诉我出了什么问题 如何检查导致出现此黄色三角形的原因 我按照 oandreeeee 的
  • Lambda 和内存泄漏:寻找替代方法

    Edit 如果一位有能力验证此类事情的经验丰富的程序员向我展示该方法不会出现内存泄漏的证据 我将不胜感激 我已经将它引入到我的许多编码工作中 但我心中仍然有一个小疑问 不幸的是我不够好 不知道调查它的工具 原来的 我最近了解到 lambda
  • Octave - .m 文件编译器?

    我知道与Matlab可以将脚本 函数编译为可执行文件 然后与 Matlab 编译器运行时一起成为独立版本 有什么可能的方法编译与 Octave 相关的 m 文件作为可执行程序 不再需要 m 文件来运行 我想要一个独立版本的脚本 可以与八度库
  • 索引 16 处的路径中存在非法字符[重复]

    这个问题在这里已经有答案了 我在 RAD 中收到以下错误 java net URISyntaxException Illegal character in path at index 16 file E Program Files IBM
  • 在页面加载时获取ajax哈希url

    假设我在进行 ajax 调用时设置了一个哈希值 例子 http example com hash html http example com hash html 如果我加载另一个页面并单击后退按钮 我将如何检测哈希值并在加载时提取 url
  • CodeIgniter 的重写规则不起作用

    我已经安装了一个干净的 Apache2 加上 PHP 和 MySQL 服务器并启用了mod rewrite在阿帕奇配置中 我添加了 htaccess文件以从 url 中删除 index php 如 CodeIgniter wiki 中所述
  • TypeORM 是否为不同存储库提供事务?

    目前 三个不同的存储库需要将某些内容作为单个事务进行处理 我的服务代码写如下 但与我想象的不同 每个存储库都生成自己的事务 我怎么解决这个问题 TrimService Injectable export class TrimService
  • 如何使用 Python Etsy HTTP API 方法添加新项目?

    我正在尝试使用 Etsy API 在我的商店中添加新列表 在文档部分它说 下面的部分如何做到这一点 首先仅供参考 我以前从未使用过 HTTP 方法 所以我不确定如何设置代码以添加新项目 链接到 Etsy API 页面https www et
  • 如何检查子字符串是否包含“apple”中的所有字母

    如果我有字符串 axplpett 我想返回 true 因为它的子字符串 axplpe 包含 apple 的所有字母 我本来想使用set方法 但是苹果有重复字符 就这么简单 string axplpett test apple all str
  • 在母版页上使用时,ASP.Net 菜单控件呈现不正确

    我正在努力寻找 ASP Net 菜单控件与母版页结合使用时出现的奇怪问题的解决方案 当用户导航到某个页面时 via 菜单 继承自母版页 整个菜单只是展开并在屏幕上闪烁 立即折叠并呈现页面 导致屏幕上出现一些闪烁 让用户感到烦恼 现在 为此建
  • 如何使用 Jersey REST 序列化 Java 原语

    在我的应用程序中 我使用 Jersey REST 来序列化复杂对象 这工作得很好 但有一些方法只返回 int 或 boolean Jersey 无法处理原始类型 据我所知 可能是因为它们没有注释 并且 Jersey 没有默认注释 我通过创建
  • iOS 8 用户之间的数据共享

    我是 iOS 新手 我需要创建一个小型应用程序 允许注册用户在他们之间共享特定数据 我正在寻找最佳解决方案 我知道我可以创建一个服务器 它处理用户身份验证 推送通知以及在它们之间共享数据 但也许有一种更简单 更好的方法 我看到iOS 8引入
  • PostgreSQL 中写入操作的 CTE 并行查询

    From PostgreSQL 9 6 发行说明 https www postgresql org docs 9 6 static release 9 6 html AEN130398 只有通过顺序扫描访问驱动表的严格只读查询才能并行化 我