sys.dm_exec_query_stats Interaktion mit Neukompilierung

7

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):

ideale Pläne

Wenn jedoch der falsche Plan zwischengespeichert wird, erstickt er vollständig, wenn der Datumsbereich groß ist: (Beachten Sie die großen fetten Linien)

falscher Plan

Um dies zu überwinden, wurde empfohlen, entweder OPTION (OPTIMIZE FOR UNKNOWN)oder zu verwendenOPTION (RECOMPILE)

OPTIMIZE FOR UNKNOWNführt zu einem etwas besseren Plan, der alles andere als optimal ist. Ausführungen werden nachverfolgt sys.dm_exec_query_stats.

RECOMPILEfü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

Sam Safran
quelle
Ist das der Grund, warum serverfault.com/review/first-questions mich gestern beschimpft hat?
Squillman
@squillman, dies ist eigentlich die Abfrage "Heiße Antworten", aber dieses Problemmuster ist in vielen unserer Abfragen ziemlich tiefgreifend. Die ersten Fragen sehen sicher problematisch aus.
Sam Saffron
Ja, auch heute keine Liebe :)
Squillman
@squillman Das Problem mit der / review-Seite ist jetzt behoben. Weitere
Sam Saffron
Wie oft wird diese Abfrage ausgeführt? Das Datum ist möglicherweise nicht der einzige problematische Teil der Abfrage - das Tag kann auch einen großen Unterschied machen.
Jon Seigel

Antworten:

1

Vielleicht sollten Sie anstelle der Option RECOMPILE einen Planleitfaden verwenden. Sie haben bereits einen guten Plan. Fügen Sie ihn einfach als Planleitfaden für Ihre Abfrage hinzu, und der Optimierer erstellt diesen Plan jedes Mal. Siehe Optimieren von Abfragen in bereitgestellten Anwendungen mithilfe von Planleitfäden und Festlegen von Abfrageplänen mit Plan Forcing .

Wenn Ihr Fall wirklich trivial ist, rufen Sie einfach sp_create_plan_guide_from_handlemit dem guten Abfrageplan-Handle auf:

Mit dieser gespeicherten Prozedur können Sie sicherstellen, dass das Abfrageoptimierungsprogramm für eine bestimmte Abfrage immer einen bestimmten Abfrageplan verwendet.

Remus Rusanu
quelle
Ich habe hier tatsächlich 2 Pläne im Spiel, einer ist effizient für kurze Datumsbereiche, der andere für längere ... im Moment besteht meine "Lösung" / Problemumgehung darin, das Datum (das sich nur einmal am Tag ändert) einfach fest zu codieren ein Faden. Das Problem bei der Entscheidung, welchen Plan wir wählen sollen, besteht darin, dass wir diesen Wert auf etwa 60 dbs skalieren müssen.
Sam Saffron
Verwenden Sie verschiedene Abfragen, eine für die kurzen Bereiche und eine für die langen Bereiche. Führen Sie jeden mit seinem entsprechenden Plan.
Remus Rusanu
Ich habe dieses spezielle Problem behoben, indem ich .CreationDate> (GETUTCDATE () - 20) und dergleichen verwendet habe, die fest in die SQL-Zeichenfolge codiert sind. Dies hilft uns an einigen Stellen, aber an einigen anderen Stellen stecken wir mit einem hässlicheren Hack fest. Ich denke, es gibt keine DMV, die Optionen zum erneuten Kompilieren von Abfragen verfolgt, und ich denke, dies ist beabsichtigt ohne Problemumgehung
Sam Saffron