-1

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 ファイル

前もって感謝します!

4

1 に答える 1

0

数年前の 2000 年から 2005 年への移行で同様の問題が発生しました。実際に表示されたエラーは、無効なキャスト エラーでした。ここでスレッドを見つけたと思います

SQL Server >=2005 では、クエリ オプティマイザの自由度が大幅に向上しています。CASE ソリューションがおそらく最適なルートです。

于 2010-05-27T15:40:36.517 に答える