このようなことをしたくはありません:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
これはより良い方法です:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
参照:「SARGable」という言葉は実際にはどういう意味ですか?
編集+where句(または結合条件)のデータで関数を使用しないようにする2つの基本的な理由があります。
- ほとんどの場合、データの関数を使用してフィルタリングまたは結合すると、オプティマイザーがそのフィールドのインデックスにアクセスする機能が失われるため、クエリが遅くなります(またはより「コストがかかります」)
- もう1つは、関連するデータのすべての行に対して、少なくとも1つの計算が実行されていることです。
2014-02-07
のような単一の基準と比較できるように、クエリに数百、数千、または数百万の計算が追加される可能性があります。 。代わりに、データに合わせて基準を変更する方がはるかに効率的です。
「データに合わせて基準を修正する」は、「SARGABLE
を使用する」という私の言い方です。 述語」
また、どちらの間でも使用しないでください。
日付と時刻の範囲のベストプラクティスは、BETWEENを避け、常に次のフォームを使用することです。
WHERE col> ='20120101' AND col <'20120201'このフォームは、時間部分が適用可能かどうかに関係なく、すべてのタイプとすべての精度で機能します。
http://sqlmag.com/t-sql/t-sql-best-practices-part-2(Itzik Ben-Gan)