当我更改订单时,SQL 左连接多个表连接性能问题

问题描述

我正在使用 netezza 并且我有一个用例,我在 3 个表之间进行左连接。下面是我的 sql 查询

-- FAST query (finishes in <3 secs): Join order a<-b<-c 
select a.asof_date,a.sfl_fs_perm_id,b.jobsactive,b.jobscreated,b.jobsremoved,c.aqe_sector_code
from DBS_E474947..TEMP_UNIV a
       left join DBS_E474947..TEMP_JOBS b
        on a.asof_date=b.asof_date and a.factset_entity_id=b.factset_entity_id  
       left join DBS_E474947..TEMP_REFERENCE c
        on a.asof_date=c.asof_date and a.sfl_fs_perm_id=c.sfl_fs_perm_id
limit 100;

-- SLOW query (takes 400+ secs): Join order a<-c<-b
select a.asof_date,c.aqe_sector_code
from DBS_E474947..TEMP_UNIV a
       left join DBS_E474947..TEMP_REFERENCE c
        on a.asof_date=c.asof_date and a.sfl_fs_perm_id=c.sfl_fs_perm_id  
       left join DBS_E474947..TEMP_JOBS b
        on a.asof_date=b.asof_date and a.factset_entity_id=b.factset_entity_id  
limit 100;

还有尺寸

SELECT count(1) FROM DBS_E474947..TEMP_UNIV  --36152447
SELECT count(1) FROM DBS_E474947..TEMP_REFERENCE --422341884
SELECT count(1) FROM DBS_E474947..TEMP_JOBS -- 73715474

有人能帮我理解为什么第二个查询需要时间吗?我知道这是因为与其他两个表相比,TEMP_REFERENCE 表有很多记录。但这种剧烈变化背后的逻辑是什么?

查询计划是否有帮助 --更快的表 限制(成本=1758.5..1758.5 行=100 宽度=53 conf=0) l:Hash Join(左外)(cost=1758.5..1205219.9 rows=283667616751 width=53 conf=33) l:Hash Join(右外)(cost=211.8..1356.1 rows=36152447 width=49 conf=51) l:顺序扫描表“B”(成本=0.0..794.9行=73715474宽度=46 conf=80) r:哈希(成本=211.8..211.8 行=36152447 宽度=27 conf=0) l:顺序扫描表“A”(cost=0.0..211.8 rows=36152447 width=27 conf=100) r:哈希(成本=1546.7..1546.7 行=422341884 宽度=21 conf=0) l:顺序扫描表“C”(成本=0.0..1546.7行=422341884宽度=21 conf=80)(事实)

--慢桌 限制(成本=58492.0..58492.0 行=100 宽度=53 conf=0) l:Hash Join(左外)(cost=58492.0..1628262.7 rows=62717563532 width=53 conf=33) l:Hash Join(左外)(cost=1546.7..1203983.1 rows=36152447 width=31 conf=51) l:顺序扫描表“A”(cost=0.0..211.8 rows=36152447 width=27 conf=100) r:哈希(成本=1546.7..1546.7 行=422341884 宽度=21 conf=0) l:顺序扫描表“C”(成本=0.0..1546.7行=422341884宽度=21 conf=80)(事实) r:哈希(成本=794.9..794.9 行=73715474 宽度=46 conf=0) l:顺序扫描表“B”(成本=0.0..794.9行=73715474宽度=46 conf=80)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)