Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 server 什么更快:求和大于零还是大于0?_Sql Server_Sql Server 2008 R2_Sql Server 2012_Query Performance - Fatal编程技术网

Sql server 什么更快:求和大于零还是大于0?

Sql server 什么更快:求和大于零还是大于0?,sql-server,sql-server-2008-r2,sql-server-2012,query-performance,Sql Server,Sql Server 2008 R2,Sql Server 2012,Query Performance,我有这样一个问题: select sum(case when col1=@arg1 then value else null end) from t 就性能而言,使用0而不是NULL是否存在差异?像这样: select sum(case when col1=@arg1 then value else 0 end) from t 结果: Table 'sysschobjs'. Scan count 1, logical reads 1556, physical reads 0, read-ah

我有这样一个问题:

select sum(case when col1=@arg1 then value else null end) from t
就性能而言,使用
0
而不是
NULL
是否存在差异?像这样:

select sum(case when col1=@arg1 then value else 0 end) from t
结果:

Table 'sysschobjs'. Scan count 1, logical reads 1556, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 7 ms.

Table 'sysschobjs'. Scan count 1, logical reads 1556, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 6 ms.

Table 'sysschobjs'. Scan count 1, logical reads 1556, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 7 ms.

所以。。。答案-类似(如果我们只讨论性能)

在下面的测试中,我一致发现
NULL
稍微快一点

   SET STATISTICS TIME ON;
   DECLARE @i int = null; /*Or set to zero*/

   WITH 
    E1(N) AS 
    (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    )                                       -- 1*10^1 or 10 rows
    , E2(N) AS (SELECT 1 FROM E1 a, E1 b)   -- 1*10^2 or 100 rows
    , E4(N) AS (SELECT 1 FROM E2 a, E2 b)   -- 1*10^4 or 10,000 rows
    , E8(N) AS (SELECT 1 FROM E4 a, E4 b)   -- 1*10^8 or 100,000,000 rows

    SELECT SUM(@i) FROM E8 
    OPTION (MAXDOP 1)
平均为608ms,总计100000000个值。(即每次聚集6纳秒)

NULL
one在

sqllang.dll!CESRunTimeErrorSink::SetAggFnSkippedNull
假定设置指向消息的标志

警告:聚合或其他集合会消除空值 手术

但总体而言似乎更快(以下以毫秒为单位的运行时间)


当然,在这种情况下(所有输入都是
NULL
),它们会返回不同的结果,如果您想将两者互换处理,则需要
ISNULL(SUM(@i),0)

您能提供sql server实例的版本吗?提前感谢。@Devart RTM版本的SqlServer 2014.on 2012 sp3也会得到类似的结果。谢谢这个tipThanks,很棒的剧本!在我们的服务器(2008r2)上进行了尝试,每次5次,平均11753ms对12699ms,因此速度慢了8.04%,快了7.44%。你的平均成绩是慢8.58%或快7.91%,所以这是相似的!
sqllang.dll!CESRunTimeErrorSink::SetAggFnSkippedNull
+---------+--------+------++-------+
|         |  NULL  |  0   || Diff  |
+---------+--------+------++-------+
| Trial 1 | 7027   | 7592 || 565   |
| Trial 2 | 6981   | 7743 || 762   |
| Trial 3 | 7451   | 8015 || 564   |
| Trial 4 | 6997   | 7591 || 594   |
| Trial 5 | 7018   | 7574 || 556   |
+---------+--------+------++-------+
| Avg     | 7094.8 | 7703 || 608.2 |
+---------+--------+------++-------+