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

PostgreSQL: How to read parallel explain analyze (rows doesn't match single thread)

我正在加入两个 tables,主要 (ui_cdc_s5_misto_cas_zdroj_aggregace) 索引 table 和从属 table (ui_cdc_s5_misto_cas_zdroj_aggregace_zdrobneni) 通过 id,从属 table 有 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

如果 运行 非并行,它会像我期望的那样工作,它在主 table 上应用索引扫描,并将获得 4042 行,依赖 table 它应用 seq 扫描并采取所有 9 131 407 行并进行散列连接。

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

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

->  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

为什么数字不匹配,是因为它真的没有读取整个 table(我觉得不太可能)还是其中有其他逻辑?

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),所以数字没有被分割。

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