DB2四表关联查询耗时过长及MAVAILABLE条件过滤无结果问题排查
问题分析与修正
1. 查询耗时过长的原因及解决
你的SQL语句存在致命的关联条件错误,直接导致了无意义的笛卡尔积,引发查询超时:
- 错误点:关联PART表时,你写的
inner join part on man.mid = avail.mid,这个条件和PART表的字段完全无关。这相当于把MAN与AVAIL关联后的结果集,和PART表做了全量匹配(只要MAN和AVAIL的MID相等,就和所有PART行关联),哪怕单表只有500行,笛卡尔积后的数据量会瞬间膨胀到数万甚至数十万行,再关联LVL表后,数据量进一步增大,最终导致查询超时。 - 修正:PART表和MAN表的正确关联条件应该是PART的MID与MAN的MID匹配,把这行改为:
inner join part on part.mid = man.mid
2. 添加MAVAILABLE = 'YES'返回0行的原因
这个问题是第一个错误的连锁反应:
- 错误的关联条件导致MAN+AVAIL(MAVAILABLE='YES')的结果集和PART表做了错误的全量匹配,而在这些错误匹配的结果里,没有同时满足
PNAME like '%phyll%'的行,所以返回0行。只要修正上述的关联条件,这个问题就会自动解决。
修正后的完整SQL
select part.pcode, man.mcode, lvl.quantity, man.mname from man inner join avail on man.mid = avail.mid inner join part on part.mid = man.mid inner join lvl on part.pid = lvl.pid where PNAME like '%phyll%' and MAVAILABLE = 'YES'
额外优化建议(可选)
虽然你的表行数很少,修正关联条件后查询速度已经足够,但如果想进一步提升性能,可以考虑在以下字段创建索引:
- PART表:
MID、PNAME - MAN表:
MID - AVAIL表:
MID、MAVAILABLE - LVL表:
PID
内容的提问来源于stack exchange,提问作者Abel
相关产品推荐
相关产品推荐

