risposta

3

Nel test di seguito ho trovato costantemente NULL è leggermente più veloce.

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) 

In media da 608 ms per aggregare 100.000.000 di valori. (ovvero 6 nanosecondi per aggregazione).

Il NULL si spende più tempo in

sqllang.dll!CESRunTimeErrorSink::SetAggFnSkippedNull 

impostazione Presumibilmente la bandiera che conduce al messaggio

Attenzione: valore Null viene eliminato da un aggregato o altra SET operazione.

Ma nel complesso sembrava più veloce (tempi trascorsi in ms sotto).

+---------+--------+------++-------+ 
|   | 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 | 
+---------+--------+------++-------+ 

Naturalmente in questo caso (in cui tutto l'input è NULL) tornano risultati diversi e si avrebbe bisogno di un ISNULL(SUM(@i),0) se si voleva trattare i due in modo intercambiabile.

+0

puoi fornire la versione dell'istanza del server sql? Grazie in anticipo. – Devart

+0

@Devart RTM versione di SqlServer 2014. –

+0

su 2012 sp3 ottenere risultati simili. grazie per questo suggerimento – Devart

4
DECLARE @type CHAR(2) = 'U' 

-- [Expr1042] = Scalar Operator(CASE WHEN [Expr1048]=(0) THEN NULL ELSE [Expr1049] END) 

SELECT SUM(CASE WHEN [type] = @type THEN 1 END) 
FROM sys.objects 

-- [Expr1042] = Scalar Operator(CASE WHEN [Expr1048]=(0) THEN NULL ELSE [Expr1049] END) 

SELECT SUM(CASE WHEN [type] = @type THEN 1 ELSE NULL END) 
FROM sys.objects 

-- [Expr1042] = Scalar Operator(CASE WHEN [Expr1048]=(0) THEN NULL ELSE [Expr1049] END) 

SELECT SUM(CASE WHEN [type] = @type THEN 1 ELSE 0 END) 
FROM sys.objects 

risultati:

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. 

così ... risposta - simili (se parliamo solo di performance)

Problemi correlati