我有这些行:
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
答案 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开发人员,请让他们查看查询计划,看看是否有其他因素导致性能问题。