我们在 SQL Server 2008 (SP1) - 10.0.2531.0 (X64) - Win2008 SP2 (X64) 上遇到了一个奇怪的情况。以下是一个复杂的查询语句:
T1有约1.3亿行,T2有约30万行。
这些查询在相当大的Dev服务器上运行大约5个小时 - 这很慢,但我们能做什么呢?
在我们调查可能的优化方法时,我们发现将查询中的"isnull"更改为"coalesce"可以使性能提高一倍 - 现在查询只需要大约2个小时就可以完成。 UPD: 当我们删除所有的
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吗?
(t1.vchCol1 = t2.vchCol1)
在性能上比运行一个函数要好(它喜欢强制进行表扫描),但它需要将ANSI_NULLS
设置为OFF
。 - cHao