Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
USE tempdb
GO
IF OBJECT_ID('tempdb.dbo.#temp') IS NOT NULL
DROP TABLE #temp
GO
SELECT TOP(1000000) val = NULLIF(ROW_NUMBER() OVER (ORDER BY 1/0) % 2, 1)
INTO #temp
FROM [master].dbo.spt_values s1
CROSS JOIN [master].dbo.spt_values s2
GO
CREATE NONCLUSTERED INDEX ix1 ON #temp (val)
GO
CREATE NONCLUSTERED INDEX ix2 ON #temp (val) WHERE val IS NOT NULL
GO
SELECT i.name, a.total_pages, a.used_pages
FROM sys.indexes i
JOIN sys.partitions p ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
JOIN sys.allocation_units a ON p.[partition_id] = a.container_id
WHERE i.[object_id] = OBJECT_ID('#temp')
AND i.name IS NOT NULL
name total_pages used_pages
----------- ------------- ------------
ix1 2739 2734
ix2 1369 1366
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT SUM(val) FROM #temp WITH(INDEX(ix1))
SELECT SUM(val) FROM #temp WITH(INDEX(ix1)) WHERE val IS NOT NULL
SELECT SUM(val) FROM #temp WITH(INDEX(ix2)) WHERE val IS NOT NULL
Table '#temp_000000000005'. Scan count 1, logical reads 2729, physical reads 0, ...
SQL Server Execution Times:
CPU time = 125 ms, elapsed time = 123 ms.
Table '#temp_000000000005'. Scan count 1, logical reads 1372, physical reads 0, ...
SQL Server Execution Times:
CPU time = 62 ms, elapsed time = 64 ms.
Table '#temp__000000000005'. Scan count 1, logical reads 1365, physical reads 0, ...
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 51 ms.

Как оказалось, операции агрегирования, в которых преобладают NULL значения обрабатываются быстрее.
Что быстрее: 0 или NULL?