PostgreSQL:如何读取并行解释分析(行与单个线程不匹配)
我通过id连接两个表,main(ui_cdc_s5_misto_cas_zdroj_aggregace)索引表和依赖表(ui_cdc_s5_misto_cas_zdroj_aggregace_zdrobneni),依赖表有9 131 407行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
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比两个工人进程中的任何一个都小,这意味着领导进程结束的时间比他们完成平均时间的时间早?我想是的。