1

在最近的 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 来解决这个问题。其他解决方案是创建可以解决此问题的索引计算列。我们环境中的架构更改并不容易,所以想探索这里的 Sql 大师是否有一些想法或其他不需要架构更改的解决方案。我仍然无法理解优化器或整体 sql server 升级如何使这个查询变得更糟。任何帮助表示赞赏。

新泽西州

4

1 回答 1

0

以我的经验,如果有很多记录 ISNULL 会减慢查询速度。

试试这段代码,结果是一样的,但我倾向于得到最好的性能:

(b.colB is not null and b.colB = a.colB ) OR (b.colB is null and a.colB = 0)
于 2012-09-18T07:27:56.290 回答