使用SQL更新为SUM 0值还是将其排除?

时间:2016-04-06 07:58:10

标签: sql tsql

我想要很多行。

选择A或选项B是否更快(或更好的做法等)?

选项A

SELECT
    [Person]
    SUM([Value]) AS Total
FROM
    Database
WHERE
    [Value] > 0
GROUP BY
    [Person]

选项B

SELECT
    [Person]
    SUM([Value]) AS Total
FROM
    Database
GROUP BY
    [Person]

如果我有,对于人X:

0, 7, 0, 6, 0, 5, 0, 0, 0, 4, 0, 9, 0, 0

选项A确实:

a) Remove zeros
b) 7 + 6 + 5 + 4 + 9

选项B确实:

a) 0 + 7 + 0 + 6 + 0 + 5 + 0 + 0 + 0 + 4 + 0 + 9 + 0 + 0

选项A的求和较少,因为它总和的记录较少,因为我已经排除了零值的负载。但是选项B不需要WHERE子句。

任何人都知道其中任何一个是否明显更快/更好?或者这只是一种无关紧要的事情?

谢谢: - )

4 个答案:

答案 0 :(得分:6)

好吧,如果你有一个与where子句完全匹配的过滤索引,并且该索引删除了大量数据(例如:数据的一大块是ner),然后肯定是第一个...如果你有这样的索引:那么你需要在你的特定数据上测试,但我会可能期望未经过滤的场景更快,因为如果它不需要进行分支等,它可以使用一系列技巧来做总和。

但是,这两个示例目前在功能上并不相同(第二个包含值,第一个没有)。

答案 1 :(得分:2)

假设Value始终为正,如果Person全部为零,则第二个查询可能仍会返回较少的行。

否则,您应该只在非常大的行上测试实际的运行时/ CPU。

答案 2 :(得分:1)

正如已经指出的那样,这两者在功能上并不相同。除了已经指出的差异(负值,不同的输出行数),选项B还过滤掉Value为NULL的行。选项A没有。

答案 3 :(得分:0)

根据这两者的执行计划并使用与您提供的数据集类似的小数据集,选项B略快,估计子树成本为.0146636与.0146655。但是,根据查询或数据集的大小,您可能会得到不同的结果。唯一的选择是自己测试和看看。

http://www.developer.com/db/how-to-interpret-query-execution-plan-operators.html

Drop Table #Test
Create Table #Test (Person nvarchar(200), Value int)
Insert Into #Test
Select 'Todd', 12 Union
Select 'Todd', 11 Union
Select 'Peter', 20 Union
Select 'Peter', 29 Union
Select 'Griff', 10 Union
Select 'Griff', 0 Union
Select 'Peter', 0 Union


SELECT [Person], SUM([Value]) AS Total
FROM #Test
WHERE [Value] > 0
GROUP BY [Person]

SELECT [Person],SUM([Value]) AS Total
FROM #Test
GROUP BY [Person]