日付式クエリ: 文字列リテラルを使用すると高速化
次の例に示すように、条件内で日付式を使用するクエリは、速度が低下することがよくあります。 SQL Server 2008 のパフォーマンス:
ただし、日付式を「2013-05-01」などの文字列リテラルに置き換えると、クエリの実行が大幅に高速化されることがわかりました。この矛盾は多くの開発者を困惑させています。
パフォーマンスの差異は、日付式が使用された場合に結果のカーディナリティを推定する方法に影響を与える SQL Server 2008 の内部バグから生じます。質問にあるような日付式が提示されると、SQL Server は、それが指定された月の最初の日付に対応する定数値を表すものと誤って想定します。これにより、カーディナリティの推定が不正確になり、クエリ プランが非効率になります。
一方、日付値に文字列リテラルを使用すると、SQL Server は実行時に実際の値と照合し、より正確なカーディナリティの推定を導き出す必要があります。これにより、オプティマイザはより最適なクエリ プランを生成できるようになり、実行が高速化されます。
このバグを回避するには、代わりに次の代替式を使用できます。
この式は定数を返します。現在の月の最初の日を表す日付値。これはクエリの意図された動作と一致します。この置換により、オプティマイザはカーディナリティを正確に推定し、より効率的なクエリ プランを生成し、日付式に関連するパフォーマンスのボトルネックを解決できます。
以上がSQL Server 2008 の日付式クエリが文字列リテラル クエリよりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。