Union SQL查询性能

时间:2013-09-23 15:02:02

标签: sql query-performance

我有一个表格,它给出了两个项目之间的值。该表格包含以下列:

itemA | itemB | value
1     | 2     | 125
1     | 3     | 56
3     | 2     | 78
2     | 4     | 24
4     | 1     | 994
3     | 4     | 7

我强调不会重复对称值。例如,现在有一个itemA = 2的行,而itemB = 1的值为= 125,因为这个数据已经与itemA = 1和itemB = 2一起存储。

现在我想得到第1项,第2项和第3项之间的所有值,但也要使用对称值。类似于SQL结果集中的内容:

itemA | itemB | value
1     | 2     | 125
1     | 3     | 56
2     | 1     | 125
2     | 3     | 78
3     | 1     | 56
3     | 2     | 78

我通过以下SQL查询成功实现了这一点:

select itemA as iA, itemB as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
union all 
select itemB as iA, itemA as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
order by iA, iB;

然而,有人告诉我,UNION运营商是性能杀手,这个表实际上有超过100 M行。但经过几个小时的脑力激荡,我找不到另一种方法来解决这个问题。请问,您是否可以看到更好,更高性能的SQL查询来获取此结果集。

提前谢谢

1 个答案:

答案 0 :(得分:2)

UNION可能是性能杀手,因为它只保留不同的项目 另一方面,UNION ALL只是简单地连接结果集,因此不会有明显的性能损失。

但是你真的应该测量它或检查解释清楚以确定。