db2提高了合并函数的性能

时间:2014-07-23 12:32:17

标签: performance db2

我们的系统在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函数,并且它的成本相同

1 个答案:

答案 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;

以下索引可能有用,也可能没有用(取决于使用的语句和数据):

  • table2(code2)
  • table2(code1)
  • table2(code1,code2)