ホームページ >データベース >mysql チュートリアル >日付式を使用した SQL Server 2008 クエリが非常に遅いのはなぜですか?
クエリの最適化: 日付式を使用してクエリ パフォーマンスの低下に対処する
SQL Server 2008 を使用する場合、日付式の影響を理解することが重要ですクエリのパフォーマンスについて。次のクエリについて考えてみましょう:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
このクエリは、文字列リテラルを使用する単純なバージョンと比較すると、非常に遅く実行されます:
Where FK.DT = '2013-05-01'
パフォーマンスの問題の原因
パフォーマンスの低下は、SQL Server のカーディナリティ推定ツールのバグが原因です。このバグは、複雑な日付式を使用する場合の推定の精度に影響します。この場合、式は現在の月の初め ('1786-06-01') に評価され、一致する行の数が誤って推定されます。
Solution
パフォーマンスの問題に対処するには、代わりに次の式を使用することをお勧めします。
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
この式は次のように計算します。これにより、より正確なカーディナリティ推定が提供され、クエリのパフォーマンスが大幅に向上します。
さらに、トレース フラグ 4199 を有効にすると、バグが解決され、複雑な日付式に対してより正確なカーディナリティ推定が提供されます。ただし、これは正しいカーディナリティ推定に依存する他のクエリに影響を与える可能性があることに注意することが重要です。
ベスト プラクティス
クエリのパフォーマンスを最適化するには、より単純なクエリの使用を検討してください。可能な場合は日付式を使用するか、文字列リテラルを使用します。複雑な日付式は基数の誤った推定につながり、クエリの最適化に影響を与える可能性があることに注意してください。
以上が日付式を使用した SQL Server 2008 クエリが非常に遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。