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

问题描述 投票:1回答:1

我通过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行,在从属表上,它将应用seq扫描,并接受所有9131407行并进行哈希联接。

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

为什么数字不匹配,是因为它确实无法读取整个表(对于我来说似乎不太可能),或者其中包含其他逻辑?

x86_64-pc-linux-gnu上的PostgreSQL 11.5,由gcc(GCC)4.8.5编译20150623(Red Hat 4.8.5-36),64位

sql postgresql parallel-processing explain
1个回答
1
投票

我承认这令人困惑。

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

rows=3043802 loops=3

[行数是平均值,因此它是实际行数的三分之一(与非并行计划比较)。

这样可以通过执行将循环数乘以tha数据的常规操作来获得正确的数字。

其他行数包含以下信息:工作进程处理了总计的行数。因为那只是关于一个进程(loops=1)的信息,所以不对数字进行除法。

因此,在这种情况下,我们可以推断出领导者流程对结果的贡献要比工作人员流程多。

© www.soinside.com 2019 - 2024. All rights reserved.