Abfrageoptimierung: Behebung langsamer Abfrageleistung mit Datumsausdrücken
Bei der Arbeit mit SQL Server 2008 ist es wichtig, die Auswirkungen von Datumsausdrücken zu verstehen auf die Abfrageleistung. Betrachten Sie die folgende Abfrage:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
Diese Abfrage wird im Vergleich zu einer einfacheren Version, die ein Zeichenfolgenliteral verwendet, außergewöhnlich langsam ausgeführt:
Where FK.DT = '2013-05-01'
Ursache des Leistungsproblems
Die langsame Leistung wird durch einen Fehler im Kardinalitätsschätzer von SQL Server verursacht. Der Fehler beeinträchtigt die Genauigkeit der Schätzungen bei der Verwendung komplexer Datumsausdrücke. In diesem Fall berechnet der Ausdruck den Anfang des aktuellen Monats ('1786-06-01') und schätzt die Anzahl der übereinstimmenden Zeilen falsch ein.
Lösung
Um das Leistungsproblem zu beheben, wird empfohlen, stattdessen den folgenden Ausdruck zu verwenden:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
Dieser Ausdruck berechnet den ersten Tag des aktuellen Monat, was genauere Kardinalitätsschätzungen liefert und die Abfrageleistung deutlich verbessert.
Darüber hinaus kann die Aktivierung des Trace-Flags 4199 den Fehler beheben und genauere Kardinalitätsschätzungen für komplexe Datumsausdrücke liefern. Es ist jedoch wichtig zu beachten, dass dies Auswirkungen auf andere Abfragen haben kann, die auf einer korrekten Kardinalitätsschätzung basieren.
Best Practices
Für eine optimale Abfrageleistung sollten Sie die Verwendung von Simpler in Betracht ziehen Verwenden Sie nach Möglichkeit Datumsausdrücke oder verwenden Sie Zeichenfolgenliterale. Bedenken Sie, dass komplexe Datumsausdrücke zu einer falsch eingeschätzten Kardinalität führen und sich auf die Abfrageoptimierung auswirken können.
Das obige ist der detaillierte Inhalt vonWarum sind meine SQL Server 2008-Abfragen mit Datumsausdrücken so langsam?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!