SSMS_Search_featured

Management Studio 17.2 – przeszukiwanie graficznych planów zapytań

Stosunkowo nie dawno bo w sierpniu tego roku (2017) wydana została nowa wersja Management Studio oznaczona numerem 17.2. Nie było w tym nic nadzwyczajnego gdyby nie fakt, że przynosi ona kilka bardzo przydatnych funkcjonalności i o jednej z nich, a mianowicie o wyszukiwaniu informacji na planach zapytania opowiemy sobie w ramach tego artykułu – zapraszam do lektury.

Najnowszą wersję SSMS możecie pobrać tutaj – jest ona dostępna za darmo jako standardowa instalacja lub jako pakiet aktualizujący istniejące SSMS w wersji 17 lub 17.1 – osobiście polecam samodzielną instalację gdyż z pakietem aktualizującym miałem małe przygody, które skłoniły mnie do instalacji standardowej. Wszystkie nowe funkcjonalności działają z SQL Server 2008 i wyżej,. Tej wersji SSMS można również używać z wersjami wcześniejszymi jednakże część “ficzerów” może po prostu nie działać. Przy otwarciu naszym oczom powinno się ukazać okienko SSMS z właściwym numerem:

Do naszych testów użyjemy bazy WideWorldImportersDW – napiszmy sobie jakieś zapytanie, w taki sposób aby miało ono większą ilość operatorów:

SELECT 
	ROW_NUMBER() OVER(ORDER BY F.[Delivery Date Key] DESC) AS LP,
	(SELECT [Date] FROM Dimension.Date AS D WHERE D.[Date]=F.[Delivery Date Key]) AS DeliveryDate,
	DC.Continent,
	DC.Country,
	DC.Region,
	DC.[Sales Territory],
	Dcu.Customer,
	Dcu.Category,
	DD.Date AS InvoiceDate
FROM Fact.Sale AS F
JOIN Dimension.City AS DC
ON DC.[City Key]=F.[City Key]
JOIN Dimension.Date AS DD
ON DD.[Date]=F.[Invoice Date Key]
join Dimension.Customer AS DCu
ON DCu.[Customer Key]=F.[Customer Key]
WHERE [WWI Invoice ID]<>20063
AND F.Quantity>(SELECT MIN(Quantity) FROM Fact.Sale)
ORDER BY F.[Customer Key] ASC

Zapewne nie jest to najbardziej rozbudowane zapytanie jakie widzieliście w życiu ale jest ono wystarczające aby zobrazować omawianą funkcjonalność. Aktualny plan powyższego zapytania przedstawia się następująco (użyłem opcji Zoom to Fit aby zmieścić cały plan na ekranie):

Wyobraźmy sobie teraz, że chcemy zlokalizować na naszym planie określoną tabelą np. DimDate. Jak to zrobić? Metodą siłową czyli ręcznie przeczesać wszystkie zakątki planu bądź np. wyświetlić sobie plan w postaci XML i tam standardowo użyć znanej wszystkim kombinacji klawiszy CTRL+F:

Takie podejście jest oczywiście mało efektywne – nieco lepszym rozwiązaniem jest odpytanie XMLa używając XQuery jednakże również wymaga to sporego nakładu sił. W Management Studio 17.2 problem rozwiązuje się sam tzn. wystarczy po kliknięciu na plan graficzny kliknąć CTRL+F i naszym oczom ukaże się nowe okienko wyszukiwania:

W pierwszej części okna wybieramy właściwość lub też obiekt, której poszukujemy. Mamy do wyboru praktycznie wszystkie interesujące nas aspekty planu wykonania:

SSMS_Search_05Następnie możemy wybrać operator – do wyboru mamy “=” gdy chcemy poszukiwać określonej wartości lub “contains” gdy chcemy wyszukiwać wartość na zasadzie LIKE. Niestety nie mamy do dyspozycji innych operatorów jak mniejszy, większy czy możliwości filtracji po kilku warunkach na raz, jednakże to i tak jest dla nas bardzo duże udogodnienie. Wykonajmy nasze pierwsze przeszukanie i znajdźmy na planie tabele Dimension.Date. Aby tego dokonać wybieramy właściwość Table  Contains Date i klikamy dostępne strzałki:

Jak możecie zauważyć na powyższej animacji podświetlane zostają wszystkie operatory gdzie używane są kolumny z naszego wymiaru Dimension.Date – całkiem fajne prawda?

Poszukajmy innych zastosowań mechanizmu – wyobraźmy sobie, że łączymy kolumny o różnych typach danych. W najlepszej sytuacji otrzymamy niejawną konwersję i ostrzeżenie na planie o tym, że niejawna konwersja nastąpiła. Znalezienie miejsca gdzie to następuje nie jest czymś nieosiągalnym jednakże teraz jest jeszcze prostsze – sprawdźmy to. Na początku zmieńmy sobie zapytanie w taki sposób aby zawierało ono inny typ danych niż pożądany, zrobimy to wykorzystując CAST przy warunku złączenia:

SELECT 
	ROW_NUMBER() OVER(ORDER BY F.[Delivery Date Key] DESC) AS LP,
	(SELECT [Date] FROM Dimension.Date AS D WHERE D.[Date]=F.[Delivery Date Key]) AS DeliveryDate,
	DC.Continent,
	DC.Country,
	DC.Region,
	DC.[Sales Territory],
	Dcu.Customer,
	Dcu.Category,
	DD.Date AS InvoiceDate
FROM Fact.Sale AS F
JOIN Dimension.City AS DC
ON DC.[City Key]=F.[City Key]
JOIN Dimension.Date AS DD
ON DD.[Date]=CAST(F.[Invoice Date Key] AS VARCHAR(10))
join Dimension.Customer AS DCu
ON DCu.[Customer Key]=F.[Customer Key]
WHERE [WWI Invoice ID]<>20063
AND F.Quantity>(SELECT MIN(Quantity) FROM Fact.Sale)
ORDER BY F.[Customer Key] ASC

Z XML wiemy, że niejawna konwersja została dokonana we właściwości ScalarString i właśnie ją wykorzystamy w naszym oknie przeszukiwania poszukując operatora, który posiada w tej właściwości tekst “Implicit”:

NA powyższym zrzucie możecie zauważyć, że niejawna konwersja ma miejsce na jednym z kluczy złączenia pomiędzy Dimension.Date oraz Fact.Sale. Co ciekawe konwersja została dokonana po stronie tabeli faktów gdyż według optymalizatora było to mniej kosztowne szczególnie, że działamy na indeksie kolumnowym i przetwarzaniu Batchowym. W każdym bądź razie możemy bardzo szybko wyszukać gdzie mamy niejawne konwersje – super!

Ostatnim przykładem jaki chciałbym Wam przedstawić jest poszukiwanie wyrażenia, które w którymś miejscu planu zostało wyliczone by dalej widniało pod tajemniczo brzmiącą nazwą np. Expr1002:

Od tej pory znalezienie źródła wyliczenia jest bardzo proste wystarczy poszukać we właściwości Column określonego wyrażenia:

Takim sposobem dowiedzieliśmy się, że Expr1012 to nic innego jak rezultat działania naszego ROW_NUMBER. Szybko i bardzo sprawnie. Oczywiście to tylko część możliwości, w rzeczywistości tak jak już wspomniałem możemy wyszukiwać praktycznie wszystko. Warto połączyć tą technikę wraz z przeglądaniem planu XML gdzie mamy konkretne nazwy atrybutów, które możemy przeszukiwać. Zapewne każdy z Was znajdzie zastosowanie tej funkcjonalności jak np. wyszukiwanie problematycznych Spooli lub ostrzeżeń. Często też funkcjonalność ta będzie pomocna przy interpretacji wyników sesji Extended Events gdzie używane są identyfikatory operatorów itp.

Podsumowując całą funkcjonalność oceniam bardzo dobrze i z całą pewnością będę jej używał na co dzień. Wam polecam jak najszybciej zainstalować najnowsze SSMS i eksperymentować – po pewnym czasie będzie to jedna z Waszych ulubionych funkcjonalności.

2 Comments

  1. Dlaczego nowsze wpisy są robione już tylko w oparciu o bazę WideWorldImporters a nie AdventureWorks? Na starszych wersjach SQL Server-a baza WWI nie działa.

    • Hmm większość demonstracji jakie przeprowadzam bazują na nowszych funkcjonalnościach, które są wbudowane w WideWorldImporters dlatego też przyzwyczaiłem się do niej. Ale jeśli zachodzi taka potrzeba sięgnę po AdventureWorks 🙂

Leave a Reply