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.
fonte
2015-11-25 22:36:49
puoi fornire la versione dell'istanza del server sql? Grazie in anticipo. – Devart
@Devart RTM versione di SqlServer 2014. –
su 2012 sp3 ottenere risultati simili. grazie per questo suggerimento – Devart