Microsoft hat den Inhalt der ShowplanXML-Ausgabe für SQL Server in den letzten Versionen verbessert und in SQL Server 2017 CU3 benutzerdefinierte Funktionsausführungsstatistiken (UDF) in den QueryTimeStats-Knoten der XML-Ausgabe eingeführt. Dies wurde auch für tatsächliche Ausführungspläne in Service Pack 2 auf SQL Server 2016 zurückportiert. Mit dieser Funktion können Sie die Auswirkungen der skalaren UDF-Ausführung als Teil der Leistungsmerkmale einer Abfrage definitiv erkennen. Es gibt jedoch einen interessanten Haken bei der Verwendung dieser Funktion; Sie müssen den tatsächlichen Ausführungsplan mit einer aktuellen Version von SQL Server Management Studio oder mit SentryOne Plan Explorer erfassen, oder die Informationen werden aus dem Ausführungsplan entfernt.
Pläne in verschiedenen SSMS-Versionen vergleichen
Ich habe kürzlich in Chicago eine Benutzergruppensitzung zum Optimieren der Abfrageleistung mit dem Plancache präsentiert und während der Sitzung habe ich die damals neueste Version von SQL Server Management Studio, Version 17.5, verwendet. Zu der Zeit hatte ich auch meine VM kürzlich auf SQL Server 2016 Service Pack 2 aktualisiert, also demonstrierte ich die neuen UdfElapsedTime- und UdfCpuTime-Informationen im eigentlichen Showplan QueryTimeStats und machte mir eine Notiz, einen Artikel darüber zu schreiben. Als ich zurückkam, um diesen Artikel tatsächlich zu beginnen, konnte ich mit genau derselben Abfrage auf genau derselben VM trotz wiederholter Versuche keinen tatsächlichen Ausführungsplan generieren, der die UdfElapsedTime- oder UdfCpuTime-Informationen enthielt. Ich konnte nicht herausfinden, was ich falsch gemacht hatte, und es stellte sich heraus, dass die Ursache des Problems darin bestand, dass ich versehentlich SQL Server Management Studio 2016 anstelle von SQL Server Management Studio 17.5 gestartet hatte. Als ich dieselbe Abfrage in SSMS 17.5 ausführte, erhielt ich plötzlich die UdfElapsedTime- und UdfCpuTime-Informationen zurück. Unten finden Sie Beispiele für das von beiden SSMS-Versionen zurückgegebene XML:
Showplan-XML von SSMS 17.5
Showplan-XML von SSMS 2016 – WaitStats und QueryTimeStats wurden vollständig entfernt
Ich habe den Microsoft Message Analyzer verwendet, um eine TCP-Ablaufverfolgung des Netzwerkverkehrs auf Port 1433 zwischen einem Client mit SSMS 2016 und einer SQL Server 2016 SP2-Instanz zu erstellen, um die TDS-Pakete zu erfassen, die vom Server an den Client gesendet werden. Dies zeigt, dass die vom Server zurückgegebene ShowPlanXML die QueryTimeStats-Informationen enthielt, obwohl sie in SSMS 2016 nicht in ShowPlanXML angezeigt werden, sodass der Client tatsächlich alle Felder entfernt, die nicht in der mit dem Client gelieferten Schemadefinition enthalten sind.
Nachrichten-Offset:1635
<.Q.u.e.r.y.T.i.m.e.S.t.a.t.s. .E.l.a.p.s.e.d.T.i.m.e.=.".2.6.7.". .C.p.u.T.i.m.e.=.".2.6.7.". .U.d.f.E.l.a.p.s.e.d.T.i.m.e.=.".2.1.5.". .U.d.f.C.p.u.T.i.m.e.=.".2.1.5.".>.<./.Q.u.e.r.y.T.i.m.e.S.t.a.t.s.>
Darauf sollten Sie bei .sqlplan-Dateien achten, die mit älteren Client-Versionen von SSMS und/oder Ausführungsplänen erstellt wurden, die von einer älteren Version von SSMS gespeichert oder kopiert wurden, was häufig passiert, wenn ich mit Clients arbeite Email.
In SSMS gibt Ihnen die Betrachtung des grafischen Ausführungsplans keinen Hinweis auf die Leistungsauswirkung der skalaren benutzerdefinierten Funktionsausführung in der Abfrage:
Wenn wir unsere Analyse der Leistung streng auf die Kosten jedes Betreibers stützen, sieht der Compute Scalar für die Funktionsausführung nicht nach einer signifikanten Auswirkung auf die Leistung aus. Auch die Tooltipps für die Bediener materialisieren die Informationen nicht und enthalten keine Warnungen über die Auswirkungen der benutzerdefinierten Funktion. Der einzige Ort, an dem wir diese Informationen innerhalb von SSMS sehen, ist derzeit im XML des Plans oder im Eigenschaftenfenster für den SELECT-Root-Operator des Plans, wie unten gezeigt:
Anhand der Informationen hier können wir jedoch sehen, dass die UdfCpuTime 85,79 % der gesamten CpuTime und die UdfElapsedTime 64,44 % der gesamten ElapsedTime für die Ausführung der Abfrage beträgt (durch Berechnung der Prozentsätze mithilfe von QueryTimeStats CpuTime und UdfCpuTime (hervorgehoben in blau oben) und ElapsedTime und UdfElapsedTime).
Verwendung von SentryOne Plan Explorer zum Abrufen von Plänen
Eines meiner bevorzugten kostenlosen Tools zur Unterstützung bei der Leistungsoptimierung von SQL Server ist SentryOne Plan Explorer, und eine der Funktionen von Plan Explorer ist seit langem die Möglichkeit, einen tatsächlichen Ausführungsplan zu generieren, indem der Befehlstext in ein neues Fenster eingefügt wird und Klicken Sie auf die Schaltfläche Get Actual Plan, wie unten gezeigt.
Da der Plan-Explorer die ShowplanXML so liest, wie sie von der SQL Server-Engine bereitgestellt wird, enthält sie auch die erweiterten Informationen in den QueryTimeStats. Wenn Sie jedoch einen Ausführungsplan öffnen, der aus einer älteren Version von Management Studio gespeichert wurde, oder wenn Sie das Plan-Explorer-Add-In für SSMS in einer älteren Version verwenden, um den Plan im Plan-Explorer anzuzeigen, werden die erweiterten Informationen nicht angezeigt.
Das Anweisungsraster der Registerkarte „Ergebnisse“ im Plan-Explorer kann mithilfe der Spaltenauswahl aktualisiert werden, um die Spalten „UDF-Dauer“ und „UDF-CPU“ zusammen mit den vorhandenen Spalten im Raster hinzuzufügen, sodass leicht erkennbar ist, wo sich die benutzerdefinierte Funktionsausführung auswirkt für große Chargen mit mehreren Anweisungen. Der Plan-Explorer bietet auch eine Hervorhebung dieser Spalten, wenn sie einen erheblichen Teil der Gesamt-CPU und/oder -Dauer ausmachen, wie unten gezeigt.
Die Plandiagramminformationen im Plan-Explorer wurden ebenfalls verbessert. Hier sind die Diagramme mit Kosten nach CPU + I/O und dann Kosten nach CPU:
Plandiagramm mit Kosten durch CPU + I/O
Plandiagramm mit Kosten nach CPU
Es gibt zusätzliche Warnungen zum Root-SELECT-Operator, wenn die Ausführungsstatistiken für benutzerdefinierte Funktionen angeben, dass sie einen erheblichen Teil der Gesamt-CPU und/oder Gesamtdauer ausmachen:
Tooltip für den Stamm SELECT-Operator
Der Compute Scalar-Operator hat auch eine Warnung im Plan-Explorer basierend auf der Zeilenanzahl, die von der Operation verarbeitet wird, selbst für Pläne, die die Erweiterungen für ShowplanXML nicht enthalten:
Tooltip für Compute Skalaroperator
Die Anzeige der Kosten nach CPU kann dabei helfen, Betreiber mit versteckten CPU-Kosten zu identifizieren, die möglicherweise durch E/A übertönt werden. Diese Möglichkeit, die Ansicht leicht zu verschieben, um Probleme mit CPU oder E/A selbst zu beheben, ist eines der vielen Unterscheidungsmerkmale zwischen Plan Explorer und SSMS. Hier ist das Kontextmenü des Diagramms, in dem Sie diese Ansicht ändern können:
Schlussfolgerung
Die Verbesserungen an Showplan-XML in SQL Server machen es viel einfacher, die Gesamtauswirkung von skalaren benutzerdefinierten Funktionen auf die Abfrageleistung in SQL Server 2016 Service Pack 2 und SQL Server 2017 Cumulative Update 3 zu bestimmen, solange Sie ein more aktuelle Version der Client-Tools oder des Plan-Explorers, um den Ausführungsplan abzurufen.