NIE ulegaj pokusie robienia takich rzeczy:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
To lepszy sposób:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
zobacz:Co tak naprawdę oznacza słowo „SARGable”?
EDYCJA + Istnieją 2 podstawowe powody, dla których warto unikać używania funkcji na danych w klauzuli WHERE (lub w warunkach złączenia).
- W większości przypadków użycie funkcji na danych do filtrowania lub łączenia uniemożliwia optymalizatorowi dostęp do indeksu w tym polu, przez co zapytanie jest wolniejsze (lub bardziej "kosztowne")
- Drugim jest to, że dla każdego wiersza danych wykonywanych jest co najmniej jedno obliczenie. Może to być dodanie setek, tysięcy lub wielu milionów obliczeń do zapytania, abyśmy mogli porównać je z jednym kryterium, takim jak
2014-02-07
. Znacznie efektywniej jest zmienić kryteria, aby dopasować je do danych.
„Zmiana kryteriów w celu dopasowania do danych” to mój sposób na opisanie „użyj SARGABLE
predykaty"
I nie używaj między nimi.
najlepszą praktyką z zakresami dat i godzin jest unikanie POMIĘDZY i zawsze używaj formularza:
WHERE col>='20120101' AND col <'20120201' Ten formularz działa ze wszystkimi typami i wszystkimi dokładnościami, niezależnie od tego, czy ma zastosowanie część czasu.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)