为什么IsNull与coalesce(同一个查询)的速度慢两倍?

zmi*_*che 5 performance isnull sql-server-2008

我们在SQL Server 2008(SP1) - 10.0.2531.0(X64) - Win2008 SP2(X64)上遇到了一个奇怪的情况.

这是一个重问题:

select t1.id, t2.id 
from t1, t2
where 
     t1.id = t2.ext_id
     and isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
     and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
     .... and about 10 more comparisons with Isnull
Run Code Online (Sandbox Code Playgroud)

UPD:比较的所有列(ID除外)是varchar(~30 ... 200)
T1是~130mln行,T2是~300k行.

这些查询相当大的Dev服务器运行~5小时 - 这很慢,但我们能做什么?

虽然我们调查了可能的优化方法 - 我们发现,在上面的查询中将"isnull"更改为"coalesce"可以获得双倍的性能提升 - 并且查询现在可以运行~2小时

UPD:当我们删除所有ISNULL检查并使用时t1.vchCol1 = t2.vchCol1,查询在40分钟后完成.

问题是:这是已知行为,我们应该避免在任何地方使用IsNull吗?

Joe*_*lli 10

我想知道你是否通过明确分开案例看到了改进:

...
AND ((t1.vchCol1 = t2.vchCol1) OR (t1.vchCol1 IS NULL AND t2.vchCol1 IS NULL))
AND ((t1.vchCol2 = t2.vchCol2) OR (t1.vchCol2 IS NULL AND t2.vchCol2 IS NULL))
...
Run Code Online (Sandbox Code Playgroud)