CAST(DATETIME DATUM) über die WHERE-Klausel
Ich bin mit SQL Server 2012 und ich würde gerne wissen, wenn ich Schreibe, der Satz:
SELECT MyDateTimeColumn
FROM MyTable
WHERE CAST(MyDateTimeColumn AS DATE) = '2014-07-09'
ist ein langsamer Weg, um trim die Zeit über DATETIME-Spalten, ich habe gesucht, aber ich kann nicht finden, etwas über diese strengen Satz und ich weiß nicht, wie um zu zeigen, dass impresive Statistiken zu zeitaufwendig cast/convert zu untersuchen, es mich.
Langsamer als was? Sie haben eine Alternative Methode zum vergleichen? Die Zeit, in der
Jede Funktion auf eine Spalte angewendet ermöglicht die Spalte non-SARGABLE. So könnte man einen index nicht verwendet. Warum nicht, WO MyDateTimeColumn >= '20140709" und MyDateTimeColumn < '20140710' ??
Verwendung von Funktionen in einer where-Klausel ist in der Regel eine schlechte Idee, wenn es vermieden werden kann
BTW, was ist es, dass Sie Fragen? :p
Ich bin gerade auf der Suche nach einem sicheren/schnellen Weg, um trim die Zeit über DATETIME-Spalten, ist mein Ansatz die niedrigste? gibt es einen schnelleren/sichereren Weg?
CAST
Funktion wird sehr wahrscheinlich unbedeutend im Vergleich mit der IO-Zeit und Zeit der Abfrage als ganzes. Sind Sie sicher, dass die CAST
ist ein Engpass oder sind Sie nur raten?Jede Funktion auf eine Spalte angewendet ermöglicht die Spalte non-SARGABLE. So könnte man einen index nicht verwendet. Warum nicht, WO MyDateTimeColumn >= '20140709" und MyDateTimeColumn < '20140710' ??
Verwendung von Funktionen in einer where-Klausel ist in der Regel eine schlechte Idee, wenn es vermieden werden kann
BTW, was ist es, dass Sie Fragen? :p
Ich bin gerade auf der Suche nach einem sicheren/schnellen Weg, um trim die Zeit über DATETIME-Spalten, ist mein Ansatz die niedrigste? gibt es einen schnelleren/sichereren Weg?
InformationsquelleAutor Ivanzinho | 2014-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
SQL 2008+,
CAST(foo AS date)
wird sargable, zusammen mit ein paar anderen Manipulationen. Blick auf die Ausführungspläne in der sqlfiddle.SQL Fiddle Demo
tut es, aber es dauert ein bisschen zu laden -- 30 Sekunden oder so
sargable
?? Was bedeutet das?InformationsquelleAutor Anon
So, können Verwendung Anon ' s Beispiel. Ich habe es beides zu haben, einen Primärschlüssel für eine Zeilennummer und Nicht Gruppierten index auf Datum.
Außerdem wähle ich zum erstellen von zufälligen Daten, anstatt ein einfaches inkrementelles update.
Hier ist der code unten, um erstellen Sie die test-Datenbank.
Nun, werfen wir einen Blick auf jede Lösung. Die vor-und Nachteile.
Werde ich Ablaufverfolgungsflags verwenden betrachten die algebraische query parse-Baum als auch die Abfrage-plan.
Lösung 1: Index-scan, der ist schlecht und muss gelten Konvertierung zu jedem Datumsfeld.
Lösung 2: Index seek, die gut ist und keine Konvertierung auf dem Datum-Feld. Jedoch kulturelle bestimmtes Datum-format.
Lösung 3: Index-Suche, die gut ist und keine Konvertierung auf dem Datum-Feld. Sie haben jedoch convert date to integer.
Lösung 4: Index suchen, was gut ist und keine Konvertierung auf dem Datum-Feld. Datum im kulturellen (Land -) neutral-format. Beste Lösung!
Lösung 5: Index suchen, was gut ist. Gilt Konvertierung zu jedem Datumsfeld, das ist schlecht. Kulturelle bestimmten Zeitpunkt konstant. Die meisten komplexen Abfrage-plan.
In der Zusammenfassung, Lösung 4 dauert die Nutzung des index und ist nicht Kultur-spezifisch.
Verwendung von cast() ist nicht ein guter Vorschlag. Es verwendet den index, aber zusätzliche Zeit für die Konvertierung jeder index-Wert während der Vergleich.
Hinweis an sich selbst, stellen Sie sicher, dass ich im detail erklären, was ich meine.
Hier sind einige gute reads auf das Thema!
Referenzen - Alles über Termine.
http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes
Referenz - Aaron Vorschläge date Nutzung.
https://sqlblog.org/2009/10/16/bad-habits-to-kick-mis-handling-date-range-queries
Was ist SARGABLE.
http://en.wikipedia.org/wiki/Sargable
InformationsquelleAutor CRAFTY DBA
Verwenden Sie diese bewährte Methode, um die "zero-out" die zeitkomponente eines datetime:
Vermeiden casting für verschiedene terminarten, wenn es ist ein schneller Weg (wie der trick oben), und auf jeden Fall versuchen zu vermeiden, mit zeichenfolgenliterale für Datums ohne wickelte Sie in ein CONVERT() um sicherzustellen, dass Ihr string-format erhalten richtig interpretiert.
Wenn Sie Leistung betrifft und wollen es zwingen, um einen index verwenden, würde ich vorschlagen, das hinzufügen einer Spalte, die vom Typ
date
(füllen Sie es mit der vorhandenen Spalte, die den Wert minus der Zeit-Teil), und den index/suchen, oder eine indizierte Sicht erstellen, welches die gleiche Sache.InformationsquelleAutor SlimsGhost