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)