Trả lời

3

Trong thử nghiệm dưới đây, tôi luôn tìm thấy NULL là hơi nhanh hơn.

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) 

Trung bình 608ms để tổng hợp 100.000.000 giá trị. (tức là 6 nano giây cho mỗi tập hợp).

Một NULL dành nhiều thời gian hơn trong

sqllang.dll!CESRunTimeErrorSink::SetAggFnSkippedNull 

Có lẽ thiết lập cờ dẫn đến thông điệp

Cảnh báo: giá trị Null được loại bỏ bởi một tổng hợp hoặc SET khác hoạt động.

Nhưng nhìn chung có vẻ nhanh hơn (thời gian trôi qua tính bằng ms dưới đây).

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

Tất nhiên trong trường hợp này (nơi tất cả các đầu vào là NULL) họ trả lại kết quả khác nhau và bạn sẽ cần một ISNULL(SUM(@i),0) nếu bạn muốn đối xử với hai thay thế cho nhau.

+0

bạn có thể cung cấp phiên bản của phiên bản máy chủ sql của bạn không? cảm ơn trước. – Devart

+0

@Devart RTM phiên bản của SqlServer 2014. –

+0

vào năm 2012 sp3 nhận được kết quả tương tự. cảm ơn cho tip này – 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 

kết quả:

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. 

như vậy ... câu trả lời - tương tự (nếu chúng ta chỉ nói về hiệu suất)

Các vấn đề liên quan