在最近的Sql server从Sql server 2005升级到2008 r2后,我看到了奇怪的行为。 升级之前,查询在亚秒运行,但现在升级后需要10秒。两个表都有数百万行..
模型表中有可空列colB的索引。下面的查询显然正在进行索引扫描,因为在Join子句中使用了标量函数isnull。
select distinct a.colA
from ptransaction a
inner join model b on ISNULL(b.colB,0) = a.colB
where a.transid = 234
我没有任何预升级计划信息,但此查询从未运行超过1秒..因此不确定Sql server 2008中的优化器行为是否发生了某些变化,导致其运行缓慢。
我知道备用解决方案,但不想在仓促中修改架构。我知道我可以将模型中的colB转换为notnull来解决这个问题。其他解决方案是创建索引计算列,以解决此问题。我们的env中的模式更改并不容易,所以想要探索Sql guru在这里是否有一些想法或其他一些不需要架构更改的解决方案。 我还是不明白优化器或整体sql server升级如何使这个查询变得更糟。 任何帮助表示赞赏。
NJ
答案 0 :(得分:0)
根据我的经验,如果有很多记录,ISNULL会减慢查询速度。
试试这段代码,结果是一样的,但我倾向于获得最佳性能:
(b.colB is not null and b.colB = a.colB ) OR (b.colB is null and a.colB = 0)