In SQL Server 2008 das Datum wurde Datentyp hinzugefügt.
Das Casting einer datetime
Spalte in date
ist sargable und kann einen Index für die datetime
Spalte verwenden.
select *
from T
where cast(DateTimeCol as date) = '20130101';
Die andere Möglichkeit besteht darin, stattdessen einen Bereich zu verwenden.
select *
from T
where DateTimeCol >= '20130101' and
DateTimeCol < '20130102'
Sind diese Abfragen gleich gut oder sollte eine der anderen vorgezogen werden?
sql-server
Mikael Eriksson
quelle
quelle
where cast(date_column as date) = 'value'
wenn es mit C # ähnlich präsentiert wirdwhere obj.date_column.Date == date_variable
.Antworten:
Der Mechanismus hinter der Sargabilität des bisherigen Castings heißt dynamisches Suchen .
SQL Server ruft eine interne Funktion
GetRangeThroughConvert
auf, um den Anfang und das Ende des Bereichs abzurufen.Es ist etwas überraschend, dass dies nicht der gleiche Bereich ist wie Ihre Literalwerte.
Erstellen einer Tabelle mit einer Zeile pro Seite und 1440 Zeilen pro Tag
Dann rennen
Die erste Abfrage
1443
lautet "read" und die zweite "2883
read", sodass ein ganzer zusätzlicher Tag gelesen und dann gegen ein verbleibendes Prädikat verworfen wird.Der Plan zeigt, dass das Suchprädikat ist
Also anstatt
>= '20130101' ... < '20130102'
es zu lesen, werden> '20121231' ... < '20130102'
dann alle2012-12-31
Zeilen verworfen .Ein weiterer Nachteil der Verwendung ist, dass die Kardinalitätsschätzungen möglicherweise nicht so genau sind wie bei der herkömmlichen Bereichsabfrage. Dies kann in einer geänderten Version Ihrer SQL-Geige gesehen werden .
Alle 100 Zeilen in der Tabelle stimmen jetzt mit dem Prädikat überein (mit einem Abstand von 1 Minute am selben Tag).
Die zweite Abfrage (Bereich) schätzt korrekt, dass 100 übereinstimmt, und verwendet einen Clustered-Index-Scan. Die
CAST( AS DATE)
Abfrage schätzt fälschlicherweise, dass nur eine Zeile übereinstimmt, und erstellt einen Plan mit Schlüsselsuchen.Die Statistiken werden nicht vollständig ignoriert. Wenn alle Zeilen in der Tabelle identisch sind
datetime
und mit dem Prädikat (z. B.20130101 00:00:00
oder20130101 01:00:00
) übereinstimmen, zeigt der Plan einen Clustered-Index-Scan mit geschätzten 31.6228 Zeilen an.In diesem Fall wird die Schätzung also aus der hier angegebenen Formel abgeleitet .
Wenn alle Zeilen in der Tabelle gleich sind
datetime
und sie nicht mit dem Prädikat übereinstimmen (z. B.20130102 01:00:00
), wird auf die geschätzte Zeilenanzahl von 1 und den Plan mit Nachschlägen zurückgegriffen.In den Fällen, in denen die Tabelle mehr als einen
DISTINCT
Wert enthält, scheinen die geschätzten Zeilen so zu sein, als ob die Abfrage genau danach gesucht hätte20130101 00:00:00
.Wenn das Statistik-Histogramm zu einem bestimmten
2013-01-01 00:00:00.000
Zeitpunkt einen Sprung aufweist , basiert die Schätzung auf demEQ_ROWS
(dh, andere Zeitpunkte an diesem Datum werden nicht berücksichtigt). Andernfalls sieht es so aus, als würde dieAVG_RANGE_ROWS
von den umliegenden Stufen verwendet, wenn es keine Stufe gibt .Da
datetime
es in vielen Systemen eine Genauigkeit von ca. 3 ms gibt, gibt es nur sehr wenige doppelte Werte, und diese Zahl ist 1.quelle
TL;DR
Teil mit ein paar Aufzählungspunkten mit verschiedenen Fällen hinzufügen, ob in diesem Fall die bisherige Besetzung eine gute Idee ist oder nicht?Ich weiß, dass dies eine langjährige Great Answer® von Martin ist, aber ich wollte hier in neueren Versionen von SQL Server einige Änderungen am Verhalten vornehmen. Dies scheint nur bis 2008R2 getestet worden zu sein.
Mit den neuen USE HINTs , die das Durchführen einiger Zeitreisen zur Schätzung der Kardinalität ermöglichen, können wir sehen, wann sich die Dinge ändern.
Verwenden Sie das gleiche Setup wie in der SQL-Geige.
Wir können die verschiedenen Level so testen:
Die Pläne für all dies finden Sie hier . Die Kompatibilitätsstufen 100 und 110 geben beide den Schlüssel-Lookup-Plan an. Ab Kompatibilitätsstufe 120 erhalten wir jedoch den gleichen Scan-Plan mit 100 Zeilenschätzungen. Dies gilt bis zur Kompatibilitätsstufe 140.
Die
>= '20130101', < '20130102'
erwartete Schätzung der Kardinalität für die Pläne liegt weiterhin bei 100.quelle