Microsoft SQL Server 2000 から 2008 にデータの一部を移行する作業を行っています。よくある問題などの中で、奇妙なことに出くわしました。以下にリンクされているのは、2000 年未満では非常に迅速に返される SQL クエリですが、2008 年未満では 20 分かかります。 WHERE 句にある次のステートメントにより、このステートメントに続くステップの実行計画が大幅に変更されます。
And (
@bOnlyUnmatched = 0 -- offending line
Or Not Exists(
SQL ステートメントと実行計画は、以下にリンクされています。
同僚は、CASE ステートメントを使用して WHERE 句の一部を書き直すことができました。これは、オプティマイザーを「だまして」、より適切な実行計画を使用するように思われます。CASE ステートメントを含むバージョンも、リンクされたアーカイブに含まれています。
なぜこれが起こっているのか、また CASE ステートメントを使用するよりも洗練された解決策があるかどうかについて、誰かが説明を持っているかどうかを確認したいと思います。この特定の問題を回避することはできますが、残りの移行をできるだけ簡単に行うために、何が起こっているのかをより広く理解したいと考えています。
SQL ステートメントと XML 実行計画を含む zip ファイル
前もって感謝します!