数据库版本升级后子查询执行得更糟

时间:2010-09-21 23:24:00

标签: sql sql-server sql-server-2008

自SQL Server 2000以来,我们一直在使用多个嵌套查询进行报告。

select * from 
 (select * from t1) t1 
  inner join
 (select * from t2) t2
 on........

我们最近将数据库从SQL Server 2000 Enterprise升级到SQL Server 2008 Standard。我们注意到一些旧查询现在运行速度很慢甚至超时。数据库的大小确实没有太大变化。

我们通过用临时表替换一些嵌套查询来解决上述问题。

但是,我们仍然不确定嵌套是否工作缓慢,因为临时表工作得更好。我们没有做任何改变加入或where子句。

任何见解或想法都会有所帮助。

4 个答案:

答案 0 :(得分:4)

通常,单个查询比使用临时表和多个查询更慢是不常见的。因此,似乎升级的SQL Server可能没有关于数据的最新知识。

升级SQL Server后,应确保有关数据库的信息是最新的。您绝对应该做的一件事是更新数据库表的统计信息。

您可能还发现使用较新的SQL Server版本运行查询可能有更好的方法。因此,在更新统计信息之后,您可以查看当前SQL Server版本的新功能。

答案 1 :(得分:1)

通常,MSSQL 2000和2008中的查询优化器非常不同。所以很有可能一些查询在其中一个上运行得更快 - 基本上,你必须重新优化所有重度查询(可能使用一些新功能 - CTE,窗口函数,包含数据的索引等等) )。

根据我的经验,MSSQL 2008通常更好地“理解”嵌套查询,尽管在您的情况下可能会有所不同。如果你的临时表与嵌套查询的结果相同,那么临时表变量会更快(因为服务器必须做更多工作才能获得相同的结果)。 到目前为止,我猜你是嵌套查询导致性能问题的错误,但我不知道它究竟是什么原因。

答案 2 :(得分:1)

如果我在你的位置,我首先要评估执行计划,看看主要的成本开销在哪里。从那里你可以真正确定真正的原因。

答案 3 :(得分:1)

我希望你为了这篇文章的目的而过度简化了样本查询。否则,我不明白为什么你可以{@ 1}}子查询中的每个表,而只需要这样做:

select * from