sql - PostgreSQL:如何阅读并行解释分析(行与单线程不匹配)

标签 sql postgresql parallel-processing explain

我正在通过 id 连接两个表,主表 (ui_cdc_s5_misto_cas_zdroj_aggregace) 索引表和从属表 (ui_cdc_s5_misto_cas_zdroj_aggregace_zdrobneni),从属表有 9 131 407 行。

select *
from ui_cdc_s5_misto_cas_zdroj_aggregace a 
left join ui_cdc_s5_misto_cas_zdroj_aggregace_zdrobneni az on a.id = az.id
where 
  a.bod_vykonu_kod = 5433355900 
  and a.kod_kzam = 83121 
  and a.datum between '2017-01-01'::date and '2018-03-01'::date

如果非并行运行,它会像我预期的那样工作,它在主表上应用索引扫描并将获得 4042 行,在从属表上它应用序列扫描并获取所有 9 131 407 行并进行散列连接。

enter image description here

解释分析非并行:https://explain.depesz.com/s/5xjm

然后,如果我允许并行处理,如果我对所有实际行求和,则从属表的行数不匹配,我在 8 602 360。而且主表的行也不匹配。
注意:这个数字似乎随着每次执行而变化。

->  Parallel Seq Scan on reports.ui_cdc_s5_misto_cas_zdroj_aggregace_zdrobneni az  (cost=0.00..87618.15 rows=2945615 width=24) (actual time=0.035..939.911 rows=3043802 loops=3)
      Output: az.id, az.zahranicni, az.pul_den, az.v_vytizeni
      Buffers: shared hit=58162
      Worker 0: actual time=0.027..1149.377 rows=2835236 loops=1
        Buffers: shared hit=18059
      Worker 1: actual time=0.050..1191.181 rows=2723322 loops=1
       Buffers: shared hit=17346

解释并行分析:https://explain.depesz.com/s/1HHN

为什么数字不匹配,是因为它真的没有读取整个表(对我来说似乎不太可能)还是其中有一些其他逻辑?

PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit

最佳答案

我承认这令人困惑。

并行计划中的相关行是第一行:

rows=3043802 loops=3

行数是平均值,所以它是实际行数的三分之一(与非并行计划相比)。

这样您就可以通过执行将数据与循环计数相乘的常规操作来得出正确的数字。

其他行计数包含工作进程对总计贡献了多少行的信息。因为那只是关于一个进程的信息,(loops=1),所以数字不会被分割。

因此在这种情况下,我们可以推断领导进程为结果贡献的行数比工作进程多。

关于sql - PostgreSQL:如何阅读并行解释分析(行与单线程不匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58135141/

相关文章:

sql - 环绕遗留 SQL Server 数据库的最佳 Ruby ORM?

java - 无法使用 Java/JSP 将数据插入 Apache Derby 数据库

mysql - GROUP BY 字符串的复杂连接

sql - 为什么要避免不可重复读和幻读?

bash - shell脚本运行多个文件

ruby-on-rails - Capistrano postgresql : FATAL: Peer authentication failed for user

bash - 解析 postgres 结果为 bash

postgresql - name 是 PostgreSQL 中的特殊关键字吗?

c - 并行和顺序点积程序不同的结果

c++ - 并行编程中的 READ_ONCE 和 WRITE_ONCE