我一直在努力将我们的一些数据从Microsoft SQL Server 2000迁移到2008.在常见的打嗝和诸如此类的事情中,我遇到了一些奇怪的事情。下面链接的是一个SQL查询,它在2000下很快就会返回,但在2008年需要20分钟。我已经阅读了很多关于升级SQL服务器的信息并且在检查索引,统计数据等的常用路径之前,我们得出的结论是在WHERE子句中找到的以下语句会导致此语句后面的步骤的执行计划发生显着变化:
And (
@bOnlyUnmatched = 0 -- offending line
Or Not Exists(
下面链接了SQL语句和执行计划。
同事能够使用CASE语句重写WHERE子句的一部分,这似乎“欺骗”优化器使用更好的执行计划。带有CASE语句的版本也包含在链接存档中。
我想看看是否有人解释为什么会发生这种情况,以及是否有比使用CASE声明更优雅的解决方案。虽然我们可以解决这个具体问题,但我希望对正在发生的事情有更广泛的了解,以确保其余的迁移尽可能轻松。
Zip file with SQL statements and XML execution plans
提前致谢!
答案 0 :(得分:0)
我们在2000年到2005年的迁移中遇到了类似的问题。我们看到的错误实际上是一个无效的转换错误。我想我找到了帖子here
查询优化器在SQL Server> = 2005中具有更多自由度。 CASE解决方案可能是最佳途径。