Sql 和过滤值
我有以下几行:Sql 和过滤值,sql,sql-server,performance,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 我想过滤和求和过滤值2,而不过滤值1 有什么更好的方法来处理这种情况 当前列总和查询 SELECT SU
value1 | value2 | value3
-------------------------
1231234|23423423|B
2342345|12309123|X
3242344|53453453|X
3453454|45345344|I
2531534|53434534|X
6657555|42342234|I
3242343|34534345|B
我想过滤和求和过滤值2,而不过滤值1
有什么更好的方法来处理这种情况
当前列总和查询
SELECT
SUM(value1),
SUM(CASE WHEN (value3 = 'B' OR value3 = 'I') THEN value2 ELSE 0 END) FROM t
使用此方法,30万行的成本为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
在
where
子句中,这将更快:
select sum(value2)
from t
where value3 in ('B', 'I')
如果索引位于(value3,value2)
,则速度会更快
但是,对于300k行,此查询不应花费6小时。只有当表真的是一个视图,一个非常、非常、非常复杂的视图时,才会发生这种情况。在
where
子句中,这会更快:
select sum(value2)
from t
where value3 in ('B', 'I')
如果索引位于(value3,value2)
,则速度会更快
但是,对于300k行,此查询不应花费6小时。只有当表真的是一个视图,一个非常、非常、非常复杂的视图时,才会发生这种情况。您的方法是正确的,但是对于300000行来说,如此简单的查询不应该花费6个小时。我怀疑还有其他事情在影响性能 您可以尝试将is作为子查询执行:
SELECT
SUM(value1),
(SELECT SUM(value2) FROM t WHERE value3 IN ('B','I'))
FROM t
但是,除非B和I记录很少,并且您在value3
上有一个索引,否则它不会产生显著的差异
或者,如果您可以访问优秀的DBA或SQL开发人员,让他们查看查询计划,看看是否是其他原因导致了性能问题。您的方法是正确的,但是对于300000行,这样简单的查询不应该花费6个小时。我怀疑还有其他事情在影响性能 您可以尝试将is作为子查询执行:
SELECT
SUM(value1),
(SELECT SUM(value2) FROM t WHERE value3 IN ('B','I'))
FROM t
但是,除非B和I记录很少,并且您在value3
上有一个索引,否则它不会产生显著的差异
或者,如果您可以访问优秀的DBA或SQL开发人员,让他们查看查询计划,看看是否有其他原因导致性能问题。上述答案中没有筛选值1。上述答案中没有筛选值1。