sql >> Databáze >  >> RDS >> Database

Vylepšení plánu show pro UDF

Společnost Microsoft v posledních několika verzích vylepšuje obsah výstupu ShowplanXML pro SQL Server a v SQL Server 2017 CU3 zavedla statistiky provádění uživatelem definované funkce (UDF) do uzlu QueryTimeStats výstupu XML. Toto bylo také zpětně portováno na SQL Server 2016 v aktualizaci Service Pack 2 pro skutečné plány provádění. Tato funkce vám umožňuje definitivně znát dopad provádění skalárního UDF jako součást výkonnostních charakteristik dotazu. S používáním této funkce je však spojen jeden zajímavý háček; musíte shromáždit skutečný realizační plán pomocí aktuální verze SQL Server Management Studio nebo pomocí SentryOne Plan Explorer, jinak budou informace z realizačního plánu odstraněny.

Porovnání plánů v různých verzích SSMS

Nedávno jsem prezentoval relaci uživatelské skupiny v Chicagu o ladění výkonu dotazů pomocí mezipaměti plánu a během relace jsem v té době používal nejnovější verzi SQL Server Management Studio, verzi 17.5. V té době jsem také nedávno aktualizoval svůj VM na SQL Server 2016 Service Pack 2, takže jsem demonstroval nové informace UdfElapsedTime a UdfCpuTime ve skutečném showplanu QueryTimeStats a poznamenal jsem si, že o thm napíšu článek. Když jsem se vrátil, abych skutečně začal tento článek, pomocí přesně stejného dotazu na přesně stejném virtuálním počítači, nemohl jsem navzdory opakovaným pokusům vygenerovat skutečný plán provádění, který by obsahoval informace UdfElapsedTime nebo UdfCpuTime. Nemohl jsem přijít na to, co dělám špatně, a ukázalo se, že kořenem problému bylo, že jsem omylem spustil SQL Server Management Studio 2016 místo SQL Server Management Studio 17.5. Když jsem spustil stejný dotaz v SSMS 17.5, najednou jsem dostal zpět informace UdfElapsedTime a UdfCpuTime. Níže naleznete příklady XML vrácených z obou verzí SSMS:

Zobrazit plán XML z SSMS 17.5

Zobrazit plán XML z SSMS 2016 – WaitStats a QueryTimeStats byly zcela odstraněny

Použil jsem Microsoft Message Analyzer k vytvoření trasování TCP síťového provozu na portu 1433 mezi klientem se systémem SSMS 2016 proti instanci SQL Server 2016 SP2 k zachycení paketů TDS odesílaných ze serveru klientovi. To ukazuje, že ShowPlanXML vrácená serverem obsahovala informace QueryTimeStats, i když se neobjevuje v ShowPlanXML v SSMS 2016, takže klient ve skutečnosti odstraňuje všechna pole, která nejsou zahrnuta v definici schématu dodané s klientem.

Posun zprávy: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.>

Na to je třeba dávat pozor u souborů .sqlplan, které jsou generovány pomocí starších klientských verzí SSMS a/nebo plánů provádění, které jsou uloženy nebo zkopírovány ze starší verze SSMS, což se často stává, když pracuji s klienty pomocí e-mailem.

V SSMS vám pohled na grafický plán provádění neposkytne žádnou informaci o dopadu provádění skalárních uživatelsky definovaných funkcí v dotazu na výkon:

Pokud bychom naši analýzu výkonu založili striktně na nákladech každého operátora, nevypadá výpočetní skalár pro provádění funkcí jako významný dopad na výkon. Nástroje pro operátory také neobsahují informace ani neobsahují žádná varování o dopadu uživatelem definované funkce. Jediné místo, kde aktuálně vidíme informace v SSMS, je XML plánu nebo okno Vlastnosti pro SELECT kořenového operátora plánu, jak je ukázáno níže:

S využitím zde uvedených informací však můžeme vidět, že UdfCpuTime je 85,79 % z celkového CpuTime a UdfElapsedTime je 64,44 % z celkového ElapsedTime pro provedení dotazu (provádí se matematický výpočet procent pomocí QueryTimeStats CpuTime a UdfCpuTime (zvýrazněno v modrá výše) a ElapsedTime a UdfElapsedTime).

Použití SentryOne Plan Explorer k načtení plánů

Jedním z mých oblíbených bezplatných nástrojů pro pomoc s laděním výkonu SQL Serveru je SentryOne Plan Explorer a jednou z funkcí Plan Exploreru je již dlouhou dobu možnost generovat skutečný plán provádění vložením textu příkazu do nového okna a kliknutím na tlačítko Získat skutečný plán, jak je znázorněno níže.

Protože Plan Explorer čte ShowplanXML tak, jak je poskytován modulem SQL Server, bude také obsahovat rozšířené informace v QueryTimeStats. Pokud však otevřete plán provádění, který byl uložen ze starší verze Management Studio, nebo pokud použijete doplněk Plan Explorer Addin pro SSMS ve starší verzi k zobrazení plánu v Průzkumníku plánů, rozšířené informace se nezobrazí.

Mřížku příkazů na kartě Výsledky v Průzkumníkovi plánů lze aktualizovat pomocí Výběru sloupců a přidat sloupce UDF Duration a UDF CPU spolu se stávajícími sloupci v mřížce, takže je snadné zjistit, kde má provádění uživatelem definovaných funkcí vliv. pro velké dávky s více příkazy. Plan Explorer také poskytuje zvýraznění těchto sloupců, pokud představují významnou část celkového CPU a/nebo trvání, jak je uvedeno níže.

Vylepšeny byly také informace o diagramu plánu v Průzkumníku plánu. Zde jsou diagramy používající Costs by CPU + I/O a potom Costs by CPU:

Plánový diagram pomocí nákladů podle CPU + I/O

Plánový diagram pomocí nákladů podle CPU

Na kořenovém operátoru SELECT jsou další varování, když statistiky provádění pro uživatelem definované funkce naznačují, že jsou významnou částí celkového CPU a/nebo celkového trvání:

Popisek pro kořenový adresář Operátor SELECT

Operátor Compute Scalar má v Průzkumníku plánů také varování na základě počtu řádků zpracovávaných operací, a to i pro plány, které neobsahují vylepšení pro ShowplanXML:

Popisek pro výpočet Skalární operátor

Zobrazení nákladů podle CPU může pomoci identifikovat operátory se skrytými náklady na CPU, které by mohly přehlušit I/O. Tato schopnost mírně posunout pohled za účelem řešení problémů s CPU nebo I/O samostatně je jedním z mnoha rozdílů mezi Plan Explorer a SSMS. Zde je kontextová nabídka diagramu, kde můžete toto zobrazení změnit:

Závěr

Vylepšení souboru Showplan XML v SQL Server značně usnadňuje určení celkového dopadu skalárních uživatelsky definovaných funkcí na výkon dotazů v SQL Server 2016 Service Pack 2 a SQL Server 2017 Kumulativní aktualizace 3, pokud používáte více nejnovější verzi klientských nástrojů nebo Průzkumníka plánů k načtení plánu provádění.


  1. Cena Oracle In-Memory

  2. Jaký je dobrý způsob, jak oříznout všechny mezery z řetězce v T-SQL bez UDF a bez CLR?

  3. Odebrání seznamu zapamatovaných přihlašovacích údajů a hesel v SQL Server Management Studio

  4. Vytvoření datového modelu pro systém správy parkovacích míst