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.
Nguồn
2015-11-25 22:36:49
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
@Devart RTM phiên bản của SqlServer 2014. –
vào năm 2012 sp3 nhận được kết quả tương tự. cảm ơn cho tip này – Devart