Datumsausdrucksabfragen: Schneller mit String-Literalen
Abfragen, die Datumsausdrücke innerhalb ihrer Bedingungen verwenden, wie im folgenden Beispiel zu sehen, sind oft langsam Leistung in SQL Server 2008:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
Es wurde jedoch beobachtet, dass das Ersetzen des Datumsausdrucks durch eine Zeichenfolge Literale wie „2013-05-01“ führen zu einer deutlich schnelleren Abfrageausführung. Diese Diskrepanz hat viele Entwickler verwirrt.
Die Leistungsdisparität ist auf einen internen Fehler in SQL Server 2008 zurückzuführen, der sich auf die Art und Weise auswirkt, wie die Kardinalität der Ergebnisse bei Verwendung von Datumsausdrücken geschätzt wird. Wenn ein Datumsausdruck wie der in der Frage angezeigt wird, geht SQL Server fälschlicherweise davon aus, dass es sich um einen konstanten Wert handelt, der dem ersten Datum im angegebenen Monat entspricht. Dies führt zu ungenauen Kardinalitätsschätzungen und damit ineffizienten Abfrageplänen.
Die Verwendung eines Zeichenfolgenliterals für den Datumswert zwingt SQL Server andererseits dazu, den tatsächlichen Wert zur Laufzeit zu vergleichen und genauere Kardinalitätsschätzungen abzuleiten. Dadurch kann der Optimierer optimalere Abfragepläne generieren, was zu einer schnelleren Ausführung führt.
Um diesen Fehler zu umgehen, kann man stattdessen den folgenden alternativen Ausdruck verwenden:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
Dieser Ausdruck gibt eine Konstante zurück Datumswert, der den ersten Tag des aktuellen Monats darstellt und mit dem beabsichtigten Verhalten der Abfrage übereinstimmt. Mit dieser Ersetzung kann der Optimierer die Kardinalität genau schätzen und einen effizienteren Abfrageplan erstellen, wodurch die mit Datumsausdrücken verbundenen Leistungsengpässe behoben werden.
Das obige ist der detaillierte Inhalt vonWarum sind SQL Server 2008-Datumsausdrucksabfragen langsamer als Zeichenfolgenliteralabfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!