2016-10-12 10 views
1

WHERE節でうまくいくクエリがあります。SQL:DateTimeでどのように絞り込むのが効率的ですか?

WHERE DATEDIFF(day, [EventStartDateTime], GETDATE()) <= 60 

または

WHERE EventStartDateTime < DATEADD(DY, -60, GETDATE()) 

私の質問は、より効率的である、ありますか?どうやって?今後自分自身をテストするためにこれを測定する方法はありますか?

+3

どのDBMSをお使いですか? –

答えて

2

秒1を使用し、それがsargableで、存在する場合、インデックスを使用することができます

EventStartDateTime < DATEADD(DY, -60, GETDATE()) 

またWHERE句はSargabilty matters.itも、GROUP BYと、ORDER BYに影響を持つことができる唯一の場所ではありませんHAVING句。

今後、これをテストして自分自身をテストする方法はありますか?

execution planを見ると、シークまたはスキャンを行っているかどうかを確認できます。 これは、シークが良いことを意味するものではなく、スキャンが悪いことを意味するものではありません。インデックスを持っていてSargableである場合、テーブル全体をスキャンするのではなく、*値を検索します。コメントで@AdatheDevが指し示すよう

..同じ Is this date comparison condition SARG-able in SQL?

+0

+1、列の周りの関数呼び出しを避ける。このシナリオ/ sargabilityのための追加リファレンス:http://stackoverflow.com/questions/10853774/is-this-condition-sargable – AdaTheDev

+0

はい、私は同じトピックでItzikベンガントピックを検索しようとしています – TheGameiswar

0
​​

この方法が効率的である理由に、それはインデックスがEventStartDateTimeに置かれるよう最適化されたクエリよりなることです。今日はインデックスを置かないと、将来的に使用したいかもしれません。DATEDIFF()のような関数を列に適用すると、式がより複雑になりますので、常に効率の悪いスキャンを使用します(もちろん単一の検索述語を使用する場合) 。

関連する問題