0

我有这些行:

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
4

2 回答 2

4

where这在子句中会更快:

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

使用索引会更快(value3, value2)

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

于 2013-05-23T02:30:50.397 回答
0

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

您可以尝试将其作为子查询:

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

但除非 B 和 I 记录很少并且您在value3.

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

于 2013-05-23T02:58:58.230 回答