Wir verwenden sys.dm_exec_query_stats
, um langsame Abfragen und Abfragen, die E / A-Straftäter sind, aufzuspüren.
Das funktioniert super, wir bekommen viele sehr aufschlussreiche Statistiken. Es ist klar, dass dies nicht so genau ist wie das Ausführen eines Profiler-Trace, da Sie keine Ahnung haben, wann SQL Server beschließen wird, einen Ausführungsplan zu erstellen.
Wir haben einige Fragen, bei denen der falsche Ausführungsplan zwischengespeichert wird. Zum Beispiel Abfragen wie die folgenden:
WÄHLEN SIE TOP 30 Hilfe VON Posts a JOIN Posts q ON q.Id = a.ParentId JOIN PostTags pt ON q.Id = pt.PostId WO a.PostTypeId = 2 UND a.DeletionDate IST NULL UND a.CommunityOwnedDate IST NULL UND a.CreationDate> @date UND LEN (a.Body)> 300 AND pt.Tag = @tag UND a.Score> 0 BESTELLUNG NACH a.Score DESC
Das Problem ist, dass der ideale Plan wirklich vom ausgewählten Datum abhängt (Screenshot des idealen Plans):
Wenn jedoch der falsche Plan zwischengespeichert wird, erstickt er vollständig, wenn der Datumsbereich groß ist: (Beachten Sie die großen fetten Linien)
Um dies zu überwinden, wurde empfohlen, entweder OPTION (OPTIMIZE FOR UNKNOWN)
oder zu verwendenOPTION (RECOMPILE)
OPTIMIZE FOR UNKNOWN
führt zu einem etwas besseren Plan, der alles andere als optimal ist. Ausführungen werden nachverfolgt sys.dm_exec_query_stats
.
RECOMPILE
führt dazu, dass der beste Plan ausgewählt wird, jedoch werden keine Ausführungszählungen und Statistiken nachverfolgt sys.dm_exec_query_stats
.
Gibt es eine andere DMV, mit der wir Statistiken zu Abfragen verfolgen können OPTION (RECOMPILE)
? Ist dieses Verhalten beabsichtigt? Gibt es eine andere Möglichkeit zur Neukompilierung, während die Statistiken nachverfolgt werden sys.dm_exec_query_stats
?
Hinweis: Das Framework führt parametrisierte Abfragen immer mit sp_executesql aus