Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 和过滤值_Sql_Sql Server_Performance - Fatal编程技术网

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。