总和过滤值

时间:2013-05-23 02:28:59

标签: sql sql-server performance

我有这些行:

value1 | value2 | value3
-------------------------
1231234|23423423|B
2342345|12309123|X
3242344|53453453|X
3453454|45345344|I
2531534|53434534|X
6657555|42342234|I
3242343|34534345|B

我想在不过滤value1的情况下对过滤后的value2进行过滤和求和。

做这种情况的更好方法是什么?

当前列总和查询

SELECT 
    SUM(value1),
    SUM(CASE WHEN (value3 = 'B' OR value3 = 'I') THEN value2 ELSE 0 END) FROM t

使用这种方法,300k行的成本为6小时。

预期的结果:

value1 | value2 | value3
-------------------------
1231234|23423423|B
2342345|0       |X
3242344|0       |X
3453454|45345344|I
2531534|0       |X
6657555|42342234|I
3242343|34534345|B

2 个答案:

答案 0 :(得分:4)

where子句中的速度会更快:

select sum(value2)
from t
where value3 in ('B', 'I')

(value3, value2)上的索引会更快。

但是,对于300k行,此查询不应花费6个小时。只有当这个表真的是一个视图,一个非常非常非常复杂的视图时,才会发生这种情况。

答案 1 :(得分:0)

您的方法是正确的,但一个简单的查询不应该花费6小时300,000行。我怀疑还有其他事情会影响性能。

你可以尝试做的是子查询:

SELECT 
    SUM(value1),
    (SELECT SUM(value2) FROM t WHERE value3 IN ('B','I'))
    FROM t

但它不应该产生显着的差异,除非有很少的B和I记录,并且你有value3的索引。

或者,如果您有权访问优秀的DBA或SQL开发人员,请让他们查看查询计划,看看是否有其他因素导致性能问题。