WHERE 句で日付式を使用すると、文字列リテラル値と比較してクエリの速度が大幅に低下し、クエリ パフォーマンスのジレンマが生じます。問題をさらに詳しく調べて、解決策を探ってみましょう。
パフォーマンス ギャップは、SQL Server 2008 のバグによって発生します。このバグは、データ式で日付式を使用する場合のカーディナリティの推定に影響します。 WHERE句。このバグにより、一致する行数の推定が不正確になります。
このバグを回避するには、次の最適化されたクエリが推奨されます。
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
この式現在の月の始まりを返します。これが、このシナリオで必要な選択基準となる可能性があります。
あるいは、トレース フラグ 4199 を有効にして、正確なカーディナリティ推定を強制することもできます。トレース フラグ 4199 をオンにすると、次のクエリでも目的のプランが生成されます。
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE) OPTION (QUERYTRACEON 4199)
たとえば、開始を表す値を持つ DT という列を含む FK というテーブルを使用します。毎月の次の 2 つのクエリはパフォーマンスの不一致を示しています。
-- Slow due to incorrect cardinality estimates SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) -- Fast due to accurate cardinality estimates with trace flag 4199 SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) OPTION (QUERYTRACEON 4199)
トレース フラグ 4199 が有効になっている場合、 2 番目のクエリは、最適化されたクエリ プランにより実行時間が大幅に短縮されます。
以上がWHERE 句で DateTime 式を使用すると SQL Server 2008 クエリが遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。