sql >> Database teknologi >  >> RDS >> Database

Showplan-forbedringer til UDF'er

Microsoft har forbedret indholdet af ShowplanXML-output til SQL Server i løbet af de sidste par udgivelser, og i SQL Server 2017 CU3 introducerede de brugerdefinerede funktionsudførelsesstatistikker (UDF) i QueryTimeStats-knuden i XML-outputtet. Dette blev også tilbageporteret til SQL Server 2016 i Service Pack 2 for faktiske eksekveringsplaner. Denne funktion giver dig mulighed for definitivt at kende virkningen af ​​skalar UDF-udførelse som en del af en forespørgsels præstationskarakteristika. Der er dog en interessant fangst forbundet med at bruge denne funktion; du skal indsamle den faktiske eksekveringsplan ved hjælp af en opdateret version af SQL Server Management Studio eller ved at bruge SentryOne Plan Explorer, ellers vil oplysningerne blive fjernet fra eksekveringsplanen.

Sammenligning af planer i forskellige SSMS-versioner

Jeg præsenterede for nylig en brugergruppesession i Chicago om justering af forespørgselsydeevne ved hjælp af plancachen, og under sessionen brugte jeg den seneste udgivelse af SQL Server Management Studio på det tidspunkt, version 17.5. På det tidspunkt havde jeg også for nylig opdateret min VM til SQL Server 2016 Service Pack 2, så jeg demonstrerede de nye UdfElapsedTime- og UdfCpuTime-oplysninger i selve showplanen QueryTimeStats og noterede mig selv at skrive en artikel om thm. Da jeg vendte tilbage for faktisk at starte denne artikel, ved at bruge nøjagtig den samme forespørgsel på nøjagtig samme VM, kunne jeg ikke generere en faktisk udførelsesplan, der indeholdt UdfElapsedTime- eller UdfCpuTime-oplysningerne på trods af gentagne forsøg. Jeg kunne ikke finde ud af, hvad jeg gjorde forkert, og det viste sig, at roden til problemet var, at jeg ved et uheld havde lanceret SQL Server Management Studio 2016 i stedet for SQL Server Management Studio 17.5. Da jeg kørte den samme forespørgsel i SSMS 17.5, fik jeg pludselig UdfElapsedTime- og UdfCpuTime-oplysningerne tilbage. Se nedenfor for eksempler på XML returneret fra begge SSMS-versioner:

Vis plan XML fra SSMS 17,5

Vis plan XML fra SSMS 2016 – WaitStats og QueryTimeStats er blevet fuldstændig fjernet

Jeg brugte Microsoft Message Analyzer til at producere et TCP-spor af netværkstrafik på port 1433 mellem en klient, der kører SSMS 2016 mod en SQL Server 2016 SP2-instans for at fange de TDS-pakker, der sendes fra serveren til klienten. Dette afslører, at den ShowPlanXML, der blev returneret af serveren, inkluderede QueryTimeStats-oplysningerne, selvom den ikke vises i ShowPlanXML i SSMS 2016, så klienten fjerner faktisk alle felter, der ikke er inkluderet i skemadefinitionen, der blev leveret med klienten.

Message 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.>

Dette er noget, man skal være opmærksom på med .sqlplan-filer, der er genereret ved hjælp af ældre klientversioner af SSMS og/eller eksekveringsplaner, der er gemt eller kopieret fra en ældre version af SSMS, hvilket er noget, der ofte sker, når jeg arbejder med klienter ved at e-mail.

I SSMS giver det at se på den grafiske udførelsesplan ikke nogen indikation af ydeevnepåvirkningen af ​​den skalære brugerdefinerede funktionsudførelse i forespørgslen:

Hvis vi baserede vores analyse af ydeevnen udelukkende på omkostningerne for hver enkelt operatør, ser Compute Scalar for funktionsudførelsen ikke ud til at have en væsentlig indvirkning på ydeevnen. Værktøjstipene til operatørerne materialiserer heller ikke oplysningerne eller indeholder advarsler om virkningen af ​​den brugerdefinerede funktion. Det eneste sted, vi ser den information i SSMS i øjeblikket, er i planens XML eller i egenskabsvinduet for SELECT-rodoperatøren for planen, som vist nedenfor:

Ved at bruge oplysningerne her kan vi dog se, at UdfCpuTime er 85,79% af den samlede CpuTime, og UdfElapsedTime er 64,44% af den samlede ElapsedTime for forespørgslens udførelse (ved at regne ud for at beregne procenterne ved hjælp af QueryTimeStats CpuTime og UdghCpu inTime (hi blå ovenfor), og Forløbet Tid og Udf Forløbet Tid).

Brug af SentryOne Plan Explorer til at hente planer

Et af mine foretrukne gratis værktøjer til at hjælpe med justering af SQL Server-ydelse er SentryOne Plan Explorer, og en af ​​funktionerne i Plan Explorer i lang tid har været evnen til at generere en faktisk eksekveringsplan ved at indsætte kommandoteksten i et nyt vindue og ved at klikke på knappen Hent faktisk plan, som vist nedenfor.

Da Plan Explorer læser ShowplanXML, som den leveres af SQL Server-motoren, vil den også indeholde de forbedrede oplysninger i QueryTimeStats. Men hvis du åbner en eksekveringsplan, der blev gemt fra en ældre version af Management Studio, eller hvis du bruger Plan Explorer-tilføjelsen til SSMS i en ældre version til at se planen i Plan Explorer, så vil den forbedrede information ikke blive vist.

Opgørelsesgitteret på fanen Resultater i Plan Explorer kan opdateres ved hjælp af kolonnevælgeren for at tilføje UDF-varighed og UDF CPU-kolonner sammen med de eksisterende kolonner i gitteret, hvilket gør det nemt at se, hvor brugerdefineret funktionsudførelse har en indvirkning til store multi-statement batches. Plan Explorer giver også fremhævelse af disse kolonner, når de er en væsentlig del af den samlede CPU og/eller varighed som vist nedenfor.

Plandiagramoplysningerne i Plan Explorer er også blevet forbedret. Her er diagrammerne ved hjælp af omkostninger efter CPU + I/O og derefter omkostninger efter CPU:

Planlæg diagram ved hjælp af omkostninger af CPU + I/O

Planlæg diagram ved hjælp af omkostninger af CPU

Der er yderligere advarsler på root SELECT-operatøren, når udførelsesstatistikken for brugerdefinerede funktioner indikerer, at de er en betydelig del af den samlede CPU og/eller den samlede varighed:

Værktøjstip til roden SELECT operator

Compute Scalar-operatøren har også en advarsel i Plan Explorer baseret på rækkeantallet, der behandles af operationen, selv for planer, der ikke inkluderer forbedringerne til ShowplanXML:

Værktøjstip til beregningen Skalær operatør

Visning af omkostninger efter CPU kan hjælpe med at identificere operatører med skjulte CPU-omkostninger, der kan blive overdøvet af I/O. Denne evne til at flytte visningen lidt for at fejlfinde enten CPU eller I/O alene er en af ​​de mange forskelle mellem Plan Explorer og SSMS. Her er diagrammets kontekstmenu, hvor du kan ændre denne visning:

Konklusion

Forbedringerne til Showplan XML i SQL Server gør det meget nemmere at bestemme den overordnede indvirkning af skalære brugerdefinerede funktioner på forespørgselsydeevne i SQL Server 2016 Service Pack 2 og SQL Server 2017 Cumulative Update 3, så længe du bruger en mere seneste version af klientværktøjerne eller Plan Explorer for at hente udførelsesplanen.


  1. Returnerer værdien af ​​identitetskolonnen efter indsættelse i Oracle

  2. Sådan får du et OBJECT_NAME() fra en anden database i SQL Server

  3. Produktanmeldelse – Stellar Repair til MySQL

  4. Tips til at flytte SQL Server-database fra én server til en anden - SQL Tutorial af Rajan Singh