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

PostgreSQL:如何读取并行解释分析(行与单个线程不匹配),sql,postgresql,parallel-processing,explain,Sql,Postgresql,Parallel Processing,Explain,我通过id连接两个表,main(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

我通过id连接两个表,main(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扫描,并获取所有9 131 407行,并进行哈希连接

解释并分析非平行:

然后,若我允许并行处理,那个么若我将所有实际行相加到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
解释并分析并行:

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

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


我承认这令人困惑

平行计划中的相关行为第一行:

rows=3043802 loops=3
行数是平均数,因此是实际行数的三分之一(与非并行计划相比)

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

其他行计数包含辅助进程为总计贡献了多少行的信息。因为这是关于一个进程的信息(
loops=1
),所以数字没有被划分


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

然后我猜其他数字,如实际时间,也都是平均值,因为939.911比两个工人进程中的任何一个都小,这意味着领导进程结束的时间比他们完成平均时间的时间早?我想是的。