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

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

Barbara Streisand
リリース: 2024-12-18 17:03:13
オリジナル
895 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート