浅析SQL Server的分页方式 ISNULL与COALESCE性能比较

2020-07-04 06:03:30易采站长站整理

我们再来看看一个二者的不同


DECLARE @c CHAR(10);
SELECT 'x' + COALESCE(@c, '') + 'y';
SELECT 'x' + ISNULL(@c, '') + 'y';

我们到这里其实我们可以稍微概括下二者的区别:ISNULL着重于替换,而COALESCE着重于合并。COALESCE显示忽略了NULL并用空字符串填充并压缩,而ISNULL对NULL会用空字符串填充但不会压缩。

(4)COALESCE函数支持超过两个参数

对于多个参数输入,ISNULL函数需要嵌套调用,而COALESCE能够处理任何数量,至于上限不知,所以对于多个参数使用COALESCE更加,如下使用多个参数输入。

SELECT COALESCE(a, b, c, d, e, f, g) FROM dbo.table;

而对于ISNULL,我们需要这样做

SELECT ISNULL(a, ISNULL(b, ISNULL(c, ISNULL(d, ISNULL(e, ISNULL(f, g)))))) FROM dbo.table;

二者最终执行时和利用CASE一样


CASE WHEN [tempdb].[dbo].[table].[a] IS NOT NULL THEN [tempdb].[dbo].[table].[a] ELSE CASE WHEN [tempdb].[dbo].[table].[b] IS NOT NULL THEN [tempdb].[dbo].[table].[b] ELSE CASE WHEN [tempdb].[dbo].[table].[c] IS NOT NULL THEN [tempdb].[dbo].[table].[c] ELSE CASE WHEN [tempdb].[dbo].[table].[d] IS NOT NULL THEN [tempdb].[dbo].[table].[d] ELSE CASE WHEN [tempdb].[dbo].[table].[e] IS NOT NULL THEN [tempdb].[dbo].[table].[e] ELSE CASE WHEN [tempdb].[dbo].[table].[f] IS NOT NULL THEN [tempdb].[dbo].[table].[f] ELSE [tempdb].[dbo].[table].[g] END END END END END END

(5)COALESCE和ISNULL二者性能比较

我们来运行如下查询


DBCC DROPCLEANBUFFERS;
DECLARE
@a VARCHAR(5), -- = 'str_a', -- this line changed per test
@b VARCHAR(5), -- = 'str_b', -- this line changed per test
@v VARCHAR(5),
@x INT = 0,
@time DATETIME2(7) = SYSDATETIME();
WHILE @x <= 500000
BEGIN
SET @v = COALESCE(@a, @b); --COALESCE
SET @x += 1;
END
SELECT DATEDIFF(MILLISECOND, @time, SYSDATETIME());
GO
DBCC DROPCLEANBUFFERS;
DECLARE
@a VARCHAR(5), -- = 'str_a', -- this line changed per test
@b VARCHAR(5), -- = 'str_b', -- this line changed per test
@v VARCHAR(5),
@x INT = 0,
@time DATETIME2(7) = SYSDATETIME();
WHILE @x <= 500000
BEGIN
SET @v = ISNULL(@a, @b); --ISNULL
SET @x += 1;
END
SELECT DATEDIFF(MILLISECOND, @time, SYSDATETIME());

我们有查询四个场景:(1)两个参数都为NULL(2)第一个参数为NULL(3)第二个参数为NULL(4)两个参数都为NULL。每个场景测试十次,最终得出如下结果

相关文章 大家在看