sql >> Database >  >> RDS >> Database

Showplan-verbeteringen voor UDF's

Microsoft heeft de inhoud van de ShowplanXML-uitvoer voor SQL Server de afgelopen paar releases verbeterd en in SQL Server 2017 CU3 introduceerden ze door de gebruiker gedefinieerde functie (UDF) uitvoeringsstatistieken in het QueryTimeStats-knooppunt van de XML-uitvoer. Dit werd ook terug geport naar SQL Server 2016 in Service Pack 2 voor daadwerkelijke uitvoeringsplannen. Met deze functie kunt u definitief de impact van scalaire UDF-uitvoering kennen als onderdeel van de prestatiekenmerken van een query. Er is echter een interessante vangst verbonden aan het gebruik van deze functie; u moet het daadwerkelijke uitvoeringsplan verzamelen met een up-to-date versie van SQL Server Management Studio of met SentryOne Plan Explorer, anders wordt de informatie uit het uitvoeringsplan verwijderd.

Abonnementen vergelijken in verschillende SSMS-versies

Ik heb onlangs een gebruikersgroepsessie in Chicago gepresenteerd over het afstemmen van queryprestaties met behulp van de plancache en tijdens de sessie gebruikte ik op dat moment de nieuwste release van SQL Server Management Studio, versie 17.5. Destijds had ik ook onlangs mijn VM geüpdatet naar SQL Server 2016 Service Pack 2, dus ik demonstreerde de nieuwe UdfElapsedTime- en UdfCpuTime-informatie in de eigenlijke showplan QueryTimeStats en maakte een notitie voor mezelf om er een artikel over te schrijven. Toen ik terugkwam om dit artikel daadwerkelijk te starten, met exact dezelfde query op exact dezelfde VM, kon ik ondanks herhaalde pogingen geen daadwerkelijk uitvoeringsplan genereren dat de UdfElapsedTime- of UdfCpuTime-informatie bevatte. Ik kon niet achterhalen wat ik verkeerd deed, en het bleek dat de oorzaak van het probleem was dat ik per ongeluk SQL Server Management Studio 2016 had gestart in plaats van SQL Server Management Studio 17.5. Toen ik dezelfde query uitvoerde in SSMS 17.5, kreeg ik plotseling de informatie over UdfElapsedTime en UdfCpuTime terug. Zie hieronder voor voorbeelden van de XML die wordt geretourneerd door beide SSMS-versies:

Showplan XML van SSMS 17,5

Showplan XML van SSMS 2016 – WaitStats en QueryTimeStats zijn volledig verwijderd

Ik heb de Microsoft Message Analyzer gebruikt om een ​​TCP-tracering van netwerkverkeer op poort 1433 te produceren tussen een client met SSMS 2016 en een SQL Server 2016 SP2-instantie om de TDS-pakketten vast te leggen die van de server naar de client worden verzonden. Hieruit blijkt dat de ShowPlanXML die door de server wordt geretourneerd, de QueryTimeStats-informatie bevat, hoewel deze niet voorkomt in de ShowPlanXML in SSMS 2016, dus de client verwijdert in feite alle velden die niet zijn opgenomen in de schemadefinitie die bij de client is geleverd.

Berichtoffset:1635
<.Qu.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.>

Dit is iets om op te letten met .sqlplan-bestanden die zijn gegenereerd met oudere clientversies van SSMS en/of uitvoeringsplannen die zijn opgeslagen of gekopieerd van een oudere versie van SSMS, wat vaak gebeurt als ik met clients werk door e-mail.

In SSMS geeft het bekijken van het grafische uitvoeringsplan u geen enkele indicatie van de prestatie-impact van de scalaire, door de gebruiker gedefinieerde functie-uitvoering in de query:

Als we onze analyse van de prestaties strikt baseren op de kosten van elke operator, lijkt de Compute Scalar voor de functie-uitvoering geen significante impact op de prestaties. De tooltips voor de operators bevatten de informatie ook niet en bevatten geen waarschuwingen over de impact van de door de gebruiker gedefinieerde functie. De enige plaats waar we die informatie binnen SSMS momenteel zien, is in de XML van het plan, of in het Eigenschappenvenster voor de SELECT root-operator van het plan, zoals hieronder weergegeven:

Met behulp van de informatie hier kunnen we echter zien dat de UdfCpuTime 85,79% van de totale CpuTime is en de UdfElapsedTime 64,44% van de totale ElapsedTime voor de uitvoering van de query (door de wiskunde te doen om de percentages te berekenen met behulp van de QueryTimeStats CpuTime en UdfCpuTime (gemarkeerd in blauw hierboven), en de ElapsedTime en UdfElapsedTime).

SentryOne Plan Explorer gebruiken om plannen op te halen

Een van mijn favoriete gratis tools om te helpen bij het afstemmen van SQL Server-prestaties is SentryOne Plan Explorer, en een van de functies van Plan Explorer was lange tijd de mogelijkheid om een ​​daadwerkelijk uitvoeringsplan te genereren door de opdrachttekst in een nieuw venster te plakken en klikken op de knop Actueel abonnement verkrijgen, zoals hieronder weergegeven.

Aangezien Plan Explorer de ShowplanXML leest zoals deze wordt geleverd door de SQL Server-engine, bevat deze ook de verbeterde informatie in de QueryTimeStats. Als u echter een uitvoeringsplan opent dat is opgeslagen vanuit een oudere versie van Management Studio, of als u de Plan Explorer-invoegtoepassing voor SSMS in een oudere versie gebruikt om het plan in Plan Explorer te bekijken, wordt de verbeterde informatie niet weergegeven.

Het overzichtsraster van het tabblad Resultaten in Planverkenner kan worden bijgewerkt met behulp van de Kolomkiezer om de kolommen UDF Duration en UDF CPU samen met de bestaande kolommen in het raster toe te voegen, zodat u gemakkelijk kunt zien waar de door de gebruiker gedefinieerde functie-uitvoering van invloed is voor grote batches met meerdere verklaringen. Plan Explorer biedt ook markering van deze kolommen wanneer ze een aanzienlijk deel van de totale CPU en/of duur uitmaken, zoals hieronder weergegeven.

De plandiagraminformatie in Plan Explorer is ook verbeterd. Hier zijn de diagrammen met Kosten per CPU + I/O en vervolgens Kosten per CPU:

Plan diagram met kosten door CPU + I/O

Plan diagram met kosten door CPU

Er zijn extra waarschuwingen op de root SELECT-operator wanneer de uitvoeringsstatistieken voor door de gebruiker gedefinieerde functies aangeven dat ze een aanzienlijk deel van de totale CPU en/of totale duur uitmaken:

Tooltip voor de root SELECT-operator

De operator Compute Scalar heeft ook een waarschuwing in Plan Explorer op basis van het aantal rijen dat door de bewerking wordt verwerkt, zelfs voor plannen die geen verbeteringen voor de ShowplanXML bevatten:

Tooltip voor de berekening Scalaire operator

Door de kosten per CPU weer te geven, kunnen operators worden geïdentificeerd met verborgen CPU-kosten die mogelijk worden overstemd door I/O. Deze mogelijkheid om de weergave iets te verschuiven om op zichzelf problemen met de CPU of I/O op te lossen, is een van de vele onderscheidende factoren tussen Plan Explorer en SSMS. Hier is het contextmenu van het diagram waar u deze weergave kunt wijzigen:

Conclusie

De verbeteringen aan de Showplan XML in SQL Server maken het veel gemakkelijker om de algehele impact van scalaire door de gebruiker gedefinieerde functies op de queryprestaties in SQL Server 2016 Service Pack 2 en SQL Server 2017 Cumulatieve Update 3 te bepalen, zolang u een meer recente versie van de clienttools of Plan Explorer om het uitvoeringsplan op te halen.


  1. Help ons de IDE te moderniseren in MS Access - uw stem telt!

  2. Ontsnappen aan wildcards in LIKE

  3. Oplossingen voor het zonder fouten lezen van het SQL Server-transactielogboekbestand

  4. Kan ik meerdere MySQL-rijen samenvoegen tot één veld?