我一直在努力将我们的一些数据从 Microsoft SQL Server 2000 迁移到 2008。在常见的问题和诸如此类的情况下,我遇到了一些奇怪的事情。下面链接的是一个 SQL 查询,它在 2000 下返回非常快,但在 2008 下需要 20 分钟。我已经阅读了很多关于升级 SQL 服务器的内容,并在得出结论之前走上了检查索引、统计信息等的常用路径在 WHERE 子句中找到的以下语句会导致该语句后面的步骤的执行计划发生巨大变化:
And (
@bOnlyUnmatched = 0 -- offending line
Or Not Exists(
SQL 语句和执行计划链接如下。
一位同事能够使用 CASE 语句重写 WHERE 子句的一部分,这似乎“欺骗”了优化器使用更好的执行计划。带有 CASE 语句的版本也包含在链接档案中。
我想看看是否有人解释了为什么会发生这种情况,以及是否有比使用 CASE 语句更优雅的解决方案。虽然我们可以解决这个特定问题,但我希望对正在发生的事情有更广泛的了解,以确保迁移的其余部分尽可能轻松。
提前致谢!