什么是更快:SUM超过NULL或超过0?

SQL*_*ice 5 sql-server sql-server-2008-r2 query-performance sql-server-2012

我有这样的查询:

select sum(case when col1=@arg1 then value else null end) from t
Run Code Online (Sandbox Code Playgroud)

是否存在性能方面的差异0而不是使用NULL?像这样:

select sum(case when col1=@arg1 then value else 0 end) from t
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 3

在下面的测试中,我一致发现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)
Run Code Online (Sandbox Code Playgroud)

聚合 100,000,000 个值平均需要 608 毫秒。(即每次聚合 6 纳秒)。

一个NULL人花更多的时间在

sqllang.dll!CESRunTimeErrorSink::SetAggFnSkippedNull
Run Code Online (Sandbox Code Playgroud)

大概是设置导致消息的标志

警告:空值会被聚合或其他 SET 操作消除。

但总体来说似乎更快(下面的运行时间以毫秒为单位)。

+---------+--------+------++-------+
|         |  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 |
+---------+--------+------++-------+
Run Code Online (Sandbox Code Playgroud)

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