SQL Datediff(年、…、…)は高価な計算ですか?
-
23-09-2019 - |
質問
私は、いくつかの恐ろしく複雑なSQLクエリを最適化しようとしています。
私のクエリでは、同じ関数をたくさん備えたSQLステートメントを動的に作成したため、各関数が何度もはなく1回しか呼び出されない一時テーブルを作成しました。これにより、実行時間が3/4になります。
だから私の質問は、たとえば、1,000件の年代測定の計算が100に狭くなった場合、大きな違いを見ることができると予想できますか?
編集:クエリは次のようになります:
SELECT DISTINCT M.MID, M.RE FROM #TEMP INNER JOIN M ON #TEMP.MID=M.MID
WHERE ( #TEMP.Property1=1 ) AND
DATEDIFF( year, M.DOB, @date2 ) >= 15 AND DATEDIFF( year, M.DOB, @date2 ) <= 17
これらが文字列として動的に生成されている場合(ビットとピースにまとめられます)、各反復に沿ってさまざまなパラメーターを変更できるように実行されます - 主に最後の行で、あらゆる種類の年代ごとのクエリが含まれています。
このような約420のクエリがあります。これらのデートフィーはそのように計算されています。私はそれらすべてを一時テーブルに簡単に引き込むことができることを知っています(1,000人のデートフィーは50歳になります)が、それだけの価値はありますか、それは秒で違いを生むでしょうか?私は10秒よりも改善を望んでいます。
解決
それは、パフォーマンスのヒットの範囲に関して正直になるためにあなたがしていることに正確に依存します。
たとえば、Where Clause内でDatediff(または実際に他の機能)を使用している場合、これはその列でインデックスが使用されるのを妨げるため、パフォーマンスの低下の原因になります。
たとえば、2009年にすべてのレコードを見つける基本的な例
WHERE DATEDIFF(yyyy, DateColumn, '2009-01-01') = 0
DateColumnのインデックスをうまく使用しません。一方、より良い解決策は、最適なインデックス使用量を提供することです。
WHERE DateColumn >= '2009-01-01' AND DateColumn < '2010-01-01'
私 最近ブログが付けられました 興味がある場合は、これが(パフォーマンス統計/実行計画の比較を使用して)違いについて。
Datediffを結果セットの列として返すと言うよりも、それは費用がかかります。
まず、最も時間がかかる個々のクエリを特定することから始めます。実行計画を確認して、問題がどこにあるかを確認し、そこから調整してください。
編集:指定したクエリの例に基づいて、ここでWhere句内の出会い系の使用を削除するために試してみることができるアプローチを次に示します。与えられた日付に10歳だったすべての人を見つけるための基本的な例-I 考える 数学は正しいですが、とにかくアイデアが得られます!簡単なテストを与えて、大丈夫だと思われます。シナリオに適応するのに十分簡単でなければなりません。特定の日付に15歳から17歳までの人々を見つけたい場合は、このアプローチでも可能です。
-- Assuming @Date2 is set to the date at which you want to calculate someone's age
DECLARE @AgeAtDate INTEGER
SET @AgeAtDate = 10
DECLARE @BornFrom DATETIME
DECLARE @BornUntil DATETIME
SELECT @BornFrom = DATEADD(yyyy, -(@AgeAtDate + 1), @Date2)
SELECT @BornUntil = DATEADD(yyyy, -@AgeAtDate , @Date2)
SELECT DOB
FROM YourTable
WHERE DOB > @BornFrom AND DOB <= @BornUntil
追加する重要な注意は、DOBからの年齢caculate用であるため、このアプローチはより正確です。あなたの現在の実装は、実際の日ではなく、出生年を考慮します(たとえば、2009年12月1日に生まれた人は、2010年1月1日に2010年12月1日まで1歳であると示されます)。
お役に立てれば。
他のヒント
Datediffは、文字列のようなDateTime値を処理する他の方法と比較して非常に効率的です。 (これを参照してください).
この場合、同じデータを何度も越えて行っているように聞こえます。これは、温度テーブルを使用するよりも高価になる可能性があります。たとえば、統計が生成されます。
パフォーマンスを改善するためにできるかもしれないことの1つは、MIDでTempテーブルにインデックスを入れることです。
実行計画を確認して、それが役立つかどうかを確認します(TEMPテーブルの行数に依存する可能性があります)。