为什么IsNull的速度是合并速度的两倍(相同的查询)?

| 我们在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
UPD:比较中的所有列(ID除外)均为
varchar
(〜30 ... 200) T1是约1.3亿行,T2是约30万行。 这些查询在相当大的Dev服务器上运行约5个小时-这很慢,但是我们能做什么? 并且,当我们研究了可能的优化方法时-我们发现,在上面的查询中将\“ isnull \”更改为\“ coalesce \”可获得双倍的性能提升-并且查询现在可以运行约2个小时 UPD:当我们删除所有的
ISNULL
检查并仅使用
t1.vchCol1 = t2.vchCol1
时,查询将在40分钟后完成。 问题是:这是已知行为,我们应该避免在所有地方使用IsNull?     
已邀请:
        我想知道您是否可以通过将案例明确分开来看到改进:
...
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))
...
    
        您将在该主题上找到的大多数文章似乎与此矛盾。
ISNULL
(略)快于
COALESCE
ISNULL
COALESCE
之间的区别   
COALESCE
基本上等于
CASE
  表达式和
ISNULL
是内置的   在数据库引擎中实现。   ...   这将使表演   和ѭ6的差异   这里的车费通常会更差。
ISNULL
COALESCE
  我在一个   几个不同的服务器,和
ISNULL
  似乎相当一致   胜过
COALESCE
  10%或12%。但这就是   6秒与5.3之间的差异   秒(近似平均值   服务器上每个测试的运行时间)   一百万次练习的过程。   几乎不值得使用该功能,   牺牲标准遵从性   至少在我使用这些场景的情况下   功能。
COALESCE
vs
ISNULL
vs
IS NULL OR
  表现最好的是ѭ19案,   而所有3个之间的差异   他们是次要的。     
        您可能需要考虑向每个包含校验和值的表中添加一个计算列。然后,在ID列和校验和值上创建索引,最后在联接中使用校验和值。像这样:
Alter Table T1 Add CheckSumId As CHECKSUM(vchCol1, vchCol2, vchCol3)
Alter Table T2 Add CheckSumId As CHECKSUM(vchCol1, vchCol2, vchCol3)

Create NonClustered index idx_T1_Checksum On T1(id, CheckSumId)
Create NonClustered index idx_T2_Checksum On T2(ext_id, CheckSumId)
然后您的查询将变成...
select t1.id, t2.id 
from t1 Inner Join t2
       On t1.id = t2.ext_id
       And T1.CheckSumId = T2.CheckSumId
where  isnull(t1.vchCol1, \'Null\') = isnull(t2.vchCol1, \'Null\')
     and isnull(t1.vchCol2, \'Null\') = isnull(t2.vchCol2, \'Null\')
当然,这将使用额外的索引空间,但是它只是2个整数,应该非常有效。由于每次插入,更新和删除操作都需要维护另一个索引,因此也会影响性能。但是,我怀疑这将对性能产生很大影响。     
        我知道这是一年后的事,但是... 对于这种逐列比较,您可以考虑使用EXCEPT。另外,EXCEPT将NULL当作另一个值来对待,而不是像我喜欢称之为““可能是任何东西!\”一样。 \“当您比较行以确定不同的值时,两个NULL值被视为相等。\” -来自http://msdn.microsoft.com/zh-CN/library/ms188055.aspx     

要回复问题请先登录注册