ホームページ >データベース >mysql チュートリアル >WHERE 句で DateTime 式を使用すると SQL Server 2008 クエリが遅くなるのはなぜですか?

WHERE 句で DateTime 式を使用すると SQL Server 2008 クエリが遅くなるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-18 17:03:13995ブラウズ

Why is My SQL Server 2008 Query Slow When Using DateTime Expressions in the WHERE Clause?

DateTime 式とのクエリ パフォーマンスの不一致

WHERE 句で日付式を使用すると、文字列リテラル値と比較してクエリの速度が大幅に低下し、クエリ パフォーマンスのジレンマが生じます。問題をさらに詳しく調べて、解決策を探ってみましょう。

根本原因

パフォーマンス ギャップは、SQL Server 2008 のバグによって発生します。このバグは、データ式で日付式を使用する場合のカーディナリティの推定に影響します。 WHERE句。このバグにより、一致する行数の推定が不正確になります。

最適化されたクエリ

このバグを回避するには、次の最適化されたクエリが推奨されます。

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)

この式現在の月の始まりを返します。これが、このシナリオで必要な選択基準となる可能性があります。

トレース フラグ4199

あるいは、トレース フラグ 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。