我们的系统在db2数据库方面存在一些性能问题。 最近我们发现一些SQL可能需要花费太多时间来执行。 以下是一个简单的案例
select * from table1 a
inner join table2 b on a.code = coalesce(b.code2,b.code1);
它花费大约1秒,而如果我用“b.code1”替换“coalesce(b.code2,b.code1)”, 它会快10倍。(另外:table2.code2只有空值)。
在一些复杂的陈述中,与1秒相比,它将是40秒。
但如果有一种方法可以提高性能,同时保持code2存在以防将来不会为null,那将会更好。 我尝试在每一列上创建索引,但似乎根本没有改进。 我也尝试了一些条件表达式替换coalesce函数,并且它的成本相同
答案 0 :(得分:2)
Equi-join以外的任何东西都会比Equi-join表现更差;即使您使用的是等于运算符,使用coalesce也会将其视为Equi-join。
你有关于table2的索引(code2,code1)?如果没有,它可能会有所帮助。
您可以尝试两个Equi-joins的联合
首先想到
select * from table1 a
inner join table2 b on a.code = b.code2
UNION ALL
select * from table1 a
inner join table2 b on a.code = b.code1 and b.code2 is NULL;
替代
select * from table1 a
inner join table2 b on a.code = b.code2
UNION ALL
select * from table1 a
inner join table2 b on a.code = b.code1
where b.code2 is NULL;
使用UNION而不是UNION ALL强制数据库删除重复的行。
select * from table1 a
inner join table2 b on a.code = b.code2
UNION
select * from table1 a
inner join table2 b on a.code = b.code1;
以下索引可能有用,也可能没有用(取决于使用的语句和数据):