Firma Microsoft ulepszyła zawartość danych wyjściowych ShowplanXML dla programu SQL Server w ciągu ostatnich kilku wydań, a w programie SQL Server 2017 CU3 wprowadzono statystyki wykonania funkcji zdefiniowanej przez użytkownika (UDF) w węźle QueryTimeStats danych wyjściowych XML. Zostało to również z powrotem przeniesione do SQL Server 2016 w dodatku Service Pack 2 w celu uzyskania rzeczywistych planów wykonania. Ta funkcja umożliwia ostateczne poznanie wpływu wykonania skalarnego UDF jako części charakterystyki wydajności zapytania. Istnieje jednak ciekawy haczyk związany z korzystaniem z tej funkcji; musisz zebrać rzeczywisty plan wykonania za pomocą aktualnej wersji SQL Server Management Studio lub SentryOne Plan Explorer, w przeciwnym razie informacje zostaną usunięte z planu wykonania.
Porównywanie planów w różnych wersjach SSMS
Niedawno zaprezentowałem sesję grupy użytkowników w Chicago na temat dostrajania wydajności zapytań z wykorzystaniem pamięci podręcznej planu i podczas sesji korzystałem z najnowszej w tym czasie wersji SQL Server Management Studio, wersja 17.5. W tym czasie ostatnio zaktualizowałem również moją maszynę wirtualną do SQL Server 2016 z dodatkiem Service Pack 2, więc zademonstrowałem nowe informacje UdfElapsedTime i UdfCpuTime w aktualnym QueryTimeStats showplanu i zrobiłem notatkę, aby napisać artykuł o thm. Kiedy wróciłem, aby faktycznie rozpocząć ten artykuł, używając dokładnie tego samego zapytania na dokładnie tej samej maszynie wirtualnej, nie mogłem wygenerować rzeczywistego planu wykonania, który zawierałby informacje UdfElapsedTime lub UdfCpuTime pomimo wielokrotnych prób. Nie mogłem się domyślić, co robię źle i okazało się, że źródłem problemu było to, że przypadkowo uruchomiłem SQL Server Management Studio 2016 zamiast SQL Server Management Studio 17.5. Kiedy uruchomiłem to samo zapytanie w SSMS 17.5, nagle otrzymałem informacje UdfElapsedTime i UdfCpuTime. Zobacz poniżej przykłady kodu XML zwróconego z obu wersji programu SSMS:
Showplan XML z SSMS 17,5
Showplan XML z SSMS 2016 – WaitStats i QueryTimeStats zostały całkowicie usunięte
Użyłem programu Microsoft Message Analyzer do wygenerowania śladu TCP ruchu sieciowego na porcie 1433 między klientem z uruchomionym programem SSMS 2016 a instancją SQL Server 2016 SP2 w celu przechwycenia pakietów TDS wysyłanych z serwera do klienta. To pokazuje, że ShowPlanXML zwrócony przez serwer zawierał informacje QueryTimeStats, mimo że nie pojawia się w ShowPlanXML w SSMS 2016, więc klient faktycznie usuwa wszystkie pola nie zawarte w definicji schematu dostarczonej z klientem.
Przesunięcie wiadomości: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.>
Jest to coś, na co należy uważać w przypadku plików .sqlplan, które są generowane przy użyciu starszych wersji klienta SSMS i/lub planów wykonania, które są zapisywane lub kopiowane ze starszej wersji SSMS, co często się zdarza, gdy pracuję z klientami przez e-mail.
W SSMS, spojrzenie na graficzny plan wykonania nie daje żadnych wskazówek co do wpływu na wydajność skalarnego wykonania funkcji zdefiniowanej przez użytkownika w zapytaniu:
Jeśli oparliśmy naszą analizę wydajności ściśle na kosztach każdego operatora, skalar obliczeniowy dla wykonania funkcji nie wydaje się mieć znaczącego wpływu na wydajność. Podpowiedzi dla operatorów również nie materializują informacji ani nie zawierają żadnych ostrzeżeń o wpływie funkcji zdefiniowanej przez użytkownika. Jedynym miejscem, w którym widzimy obecnie informacje w SSMS, jest plik XML planu lub okno właściwości dla operatora głównego SELECT planu, jak pokazano poniżej:
Korzystając z tych informacji, możemy jednak zauważyć, że UdfCpuTime to 85,79% całkowitego CpuTime, a UdfElapsedTime to 64,44% całkowitego ElapsedTime dla wykonania zapytania (wykonywanie obliczeń matematycznych w celu obliczenia wartości procentowych za pomocą QueryTimeStats CpuTime i UdfCpuTime (podświetlone w niebieski powyżej) oraz ElapsedTime i UdfElapsedTime).
Korzystanie z Eksploratora planów SentryOne do pobierania planów
Jednym z moich ulubionych darmowych narzędzi pomagających w dostrajaniu wydajności programu SQL Server jest SentryOne Plan Explorer, a jedną z funkcji Eksploratora planów przez długi czas była możliwość wygenerowania rzeczywistego planu wykonania poprzez wklejenie tekstu polecenia do nowego okna i klikając przycisk Pobierz aktualny plan, jak pokazano poniżej.
Ponieważ Eksplorator planów odczytuje ShowplanXML, tak jak jest dostarczany przez silnik SQL Server, będzie również zawierał rozszerzone informacje w QueryTimeStats. Jeśli jednak otworzysz plan wykonania, który został zapisany ze starszej wersji Management Studio lub użyjesz dodatku Eksplorator planów dla programu SSMS w starszej wersji, aby wyświetlić plan w Eksploratorze planów, rozszerzone informacje nie będą wyświetlane.
Siatkę instrukcji na karcie Wyniki w Eksploratorze planów można zaktualizować za pomocą opcji Wybór kolumny, aby dodać kolumny UDF Duration i UDF CPU wraz z istniejącymi kolumnami w siatce, dzięki czemu można łatwo zobaczyć, na jakie wpływ ma wykonanie funkcji zdefiniowanej przez użytkownika dla dużych partii wielowyrazowych. Plan Explorer zapewnia również podświetlanie tych kolumn, gdy stanowią one znaczną część całkowitego procesora i/lub czasu trwania, jak pokazano poniżej.
Ulepszono również informacje o diagramach planu w Eksploratorze planów. Oto diagramy wykorzystujące koszty według procesora + we/wy, a następnie koszty według procesora:
Diagram planu z wykorzystaniem kosztów według procesora + we/wy
Diagram planu z wykorzystaniem kosztów według procesora
Istnieją dodatkowe ostrzeżenia dotyczące głównego operatora SELECT, gdy statystyki wykonania funkcji zdefiniowanych przez użytkownika wskazują, że stanowią one znaczną część całkowitego procesora i/lub całkowitego czasu trwania:
Podpowiedź dla katalogu głównego WYBIERZ operator
Operator Compute Scalar ma również ostrzeżenie w Eksploratorze planów na podstawie liczby wierszy przetwarzanych przez operację, nawet w przypadku planów, które nie zawierają ulepszeń dla ShowplanXML:
Podpowiedź dla obliczeń Operator skalarny
Pokazywanie kosztów według procesora może pomóc w identyfikacji operatorów z ukrytymi kosztami procesora, które mogą zostać zagłuszone przez operacje we/wy. Ta możliwość nieznacznego przesunięcia widoku w celu samodzielnego rozwiązywania problemów z procesorem lub we/wy jest jednym z wielu wyróżników między Eksploratorem planów a SSMS. Oto menu kontekstowe diagramu, w którym możesz zmienić ten widok:
Wniosek
Ulepszenia Showplan XML w SQL Server znacznie ułatwiają określenie ogólnego wpływu skalarnych funkcji zdefiniowanych przez użytkownika na wydajność zapytań w SQL Server 2016 Service Pack 2 i SQL Server 2017 Cumulative Update 3, o ile używasz bardziej najnowszą wersję narzędzi klienta lub eksploratora planów, aby pobrać plan wykonania.