问题标签 [postgresql-parallel-query]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - CTE 上的并行查询,用于在 PostgreSQL 中写入操作
只有通过顺序扫描访问驱动表的严格只读查询才能被并行化。
我的问题是:如果 CTE(WITH
子句)仅包含读取操作,但其结果用于提供写入操作,例如插入或更新,是否也不允许并行化顺序扫描?
我的意思是,由于 CTE 很像一个临时表,它只存在于当前执行的查询中,我可以假设它的内部查询可以利用 PostgreSQL 9.6 的全新并行 seq-scan 吗?或者,否则,它是否被视为使用子查询并且无法执行并行扫描?
例如,考虑这个查询:
该 foobarbaz 计算是否预计能够并行化,还是因为删除语句而被禁止?
如果不允许,我认为可以用CREATE TEMPORARY TABLE语句替换 CTE。但我想我会遇到与CREATE TABLE是写操作相同的问题。我错了吗?
最后,我可以尝试的最后一次机会是将其作为纯读取操作执行,并将其结果用作插入和/或更新操作的输入。在事务之外它应该工作。但问题是:如果读操作和插入/更新在abegin
和commit
句子之间,无论如何都不允许?我了解它们是两个完全不同的操作,但在同一个事务和 Postgres 中。
需要明确的是,我担心的是我有大量难以阅读和难以重新设计的 SQL 查询,这些查询涉及多次顺序扫描和低性能函数调用,并且对两个表执行复杂的更改。整个过程在单个事务中运行,因为如果没有,发生故障时的混乱将完全无法恢复。
我希望能够并行化一些顺序扫描,以利用机器的 8 个 cpu 内核来更快地完成该过程。
请不要回答我需要完全重新设计那个烂摊子:我知道并且我正在努力。但这是一个伟大的项目,我们需要在此期间继续工作。
无论如何,任何建议将不胜感激。
编辑:
我添加了一份关于到目前为止我可以发现的内容的简短报告:
正如@a_horse_with_no_name 在他的评论中所说(谢谢),CTE 和查询的其余部分是单个 DML 语句,如果它有一个写操作,即使在 CTE 之外,那么 CTE 也不能并行化(我也测试过) .
此外,我发现这个wiki 页面比我在发行说明链接中找到的有关并行扫描的信息更简洁。
多亏了那个 wiki 页面,我可以检查的一个有趣的点是我需要将所涉及的函数声明为并行安全。我做到了并且工作了(在没有写作的测试中)。
另一个有趣的点是@a_horse_with_no_name 在他的第二条评论中所说的:使用 DbLink 执行纯只读查询。但是,对此进行一些调查后,我发现postgres_fdw(在 wiki 中明确提及为不支持并行扫描)使用更现代且符合标准的基础架构提供大致相同的功能。
- 而且,另一方面,即使它会起作用,我最终还是从事务外部获取数据,在某些情况下这对我来说是可以接受的,但我认为这不如一般解决方案好。
最后,我检查了是否可以在事务内的只读查询中执行并行扫描,即使它稍后执行写操作(没有触发异常并且我可以提交)。
...总之,我认为我最好的选择(如果不是唯一的选择)是重构脚本,使其先将数据读取到内存中,然后在同一事务中执行写入操作。
它会增加 I/O 开销,但是,处理我管理的延迟会更好。
postgresql - PostgreSQL 是否并行查询分区?
Postgres 现在有并行查询。表分区时是否使用并行查询,查询在主表上,并且涉及多个分区(子表)。
例如,我按一天中的时间划分。然后我想计算一个多小时内的一种事件。可以在每个分区上进行聚合,最后将结果相加。
另一种方法是在分区(子表)之间使用联合。在这种情况下,Postgres 进行并行执行。
postgresql - Postgres 9.6 并行 XPath
我已经设置了 Postgres 9.6 并检查了并行查询正在工作的随机整数的大表。但是,对另一个表的 XML 列的简单 XPath 查询始终是顺序的。在 Postgres 中,这两个 XPath 函数都被标记为并行安全的。我试图改变 XPath 成本,因此预期成本猛增,但并没有改变任何东西。我错过了什么?
示例表 DDL:
CREATE TABLE "test_table" ("xml" XML );
示例查询:
SELECT xpath('/a', "xml") FROM "test_table";
示例数据:
<a></a>
. 请注意,真实数据包含大小为 10-1000kB 的 XML。
postgresql-11 - Postgres 不应用并行查询
我正在使用“PostgreSQL 11.4,由 Visual C++ build 1914 编译,64 位”
我想为测试目的运行并行查询,下面是我的 pg_settings 参数值:
当我尝试解释查询时,它没有显示任何“工人计划”如何确认我的数据库是否支持并行查询?
++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
==================================================== ===================
如果我启用 force_parallel_mode 然后它显示“工人计划”但总是值为 1。我的设置或数据库有什么问题来运行并行查询?
++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
==================================================== ===================
postgresql - Postgres,查询性能取决于前端工具吗?
我正在尝试相同的查询
使用几个前端工具,我得到了非常不同的结果。(我多次运行查询以避免异常或兑现问题)我一直认为它取决于服务器而不是客户端工具。
首先使用 pgAdmin3 LTS 1.23
查询以 4 个线程并行运行,并在 12 秒内完成
第二次使用 DbVisualizer 10.0.21
查询仅在单线程中运行并在 70 秒内完成
(是的,我用 show 命令检查了它,并行设置如上所述)
第三个是我的 Navicat 同事
查询以 4 个线程并行运行,并在 30 秒内完成
那么谁来决定如何处理服务器或客户端的查询呢?
编辑:
问题似乎出在 DbVisualizer 上,奇怪的是,如果我只运行查询,它不会并行化,但是当使用解释分析选项时它确实如此,我在服务器上检查了这一点以确保,即屏幕截图
这是来自 pgAdmin 的解释分析
https://explain.depesz.com/s/tP8Pi
这是 DbVisualizer 的执行计划:
database - PostgreSQL 中的并发查询 - 实际发生了什么?
假设我们有两个用户对 PostgreSQL 中的同一个表运行查询。所以,
用户 1:SELECT * FROM table WHERE year = '2020'
和
用户 2:SELECT * FROM table WHERE year = '2019'
它们是否会同时执行,而不是一个接一个地执行?
我希望如果我有 2 个处理器,我可以同时运行这两个处理器。但是我认为事情变得更加复杂,这取决于数据所在的位置(例如磁盘),因为它是同一张表,是否存在分区、配置、事务等。有人可以帮助我了解如何确保就 PostgreSQL 而言,我得到了我想要的行为?在什么情况下我会得到我想要的行为,在什么情况下我不会?
编辑:我发现另一个问题非常接近我的要求 - https://dba.stackexchange.com/questions/72325/postgresql-if-i-run-multiple-queries-concurrently-under-what-情况-wo。它有点旧,没有太多答案,希望能有新的看法。
postgresql - PostgreSQL 在多大程度上支持并行 DDL?
看这里,很明显,Oracle 支持与明确列出的场景并行执行 DDL 命令。我想知道 Postgres 是否确实提供了这样的功能?我可以找到很多关于 PostgreSQL 的“并行查询”的材料,但在涉及 DDL 时却没有那么多。
例如,我可以'CREATE TABLE...AS SELECT'
并行执行多个吗?如果没有,我怎样才能实现这样的功能?如果我有一个临时表 ( CREATE TEMP TABLE
) 会发生什么?我需要为锁配置一些东西吗?
sql - 了解 PostgreSQL 并行查询跨会话的工作池中剩余多少并行工作人员?
假设我的 PostgreSQL 数据库配置中有 4 个并行工作人员池。我也有 2 节课。
在 session#1 中,SQL 当前正在执行,我的规划器随机选择为此查询启动 2 个工作程序。
那么,在会话#2 中,我怎么知道我的工人池减少了 2 个?