Administrator bazy danych zawsze stara się dostroić wydajność zapytań SQL Server. Pierwszym krokiem w dostrajaniu wydajności zapytania jest przeanalizowanie planu wykonania zapytania. Pod pewnymi warunkami program SQL Server Query Optimizer może tworzyć różne plany wykonania. W tym miejscu chciałbym dodać kilka uwag na temat Optymalizatora zapytań SQL Server. SQL Server Query Optimizer to optymalizator oparty na kosztach, który analizuje plany wykonania i decyduje o optymalnym planie wykonania zapytania. Znaczącym słowem kluczowym dla SQL Server Query Optimizer jest optymalny plan wykonania, który niekoniecznie jest najlepszym planem wykonania. Dlatego też, jeśli SQL Server Query Optimizer próbuje znaleźć najlepszy plan wykonania dla każdego zapytania, zajmuje to więcej czasu i powoduje uszkodzenie wydajności SQL Server Engine. W SQL Server 2016 firma Microsoft dodała nową możliwość do SQL Server Management Studio o nazwie Compare Showplan. Ta funkcja pozwala nam porównać dwa różne plany wykonania. Jednocześnie możemy korzystać z tej opcji offline, co oznacza, że nie musimy łączyć się z instancją SQL Server. Wyobraź sobie, że piszesz zapytanie, które działa dobrze w środowisku TEST, ale w PROD (środowisku produkcyjnym) działa bardzo słabo. Aby poradzić sobie z tym problemem, musimy porównać plany wykonawcze. Przed tą funkcją otwieraliśmy dwa SQL Server Management Studios i łączyliśmy plany wykonania, ale ta metoda była bardzo niewygodna.
Jak porównać dwa plany wykonania?
W tej demonstracji użyjemy bazy danych AdventureWorks i porównamy dwa plany wykonania, które mają różne wersje modelu szacowania kardynacji, i wykryjemy tę różnicę za pomocą Compare Showplan.
Najpierw otworzymy nowe okno zapytania w SQL Server Management Studio i klikniemy Uwzględnij rzeczywisty plan wykonania a następnie wykonaj następujące zapytanie.
SELECT soh.[SalesPersonID] ,p.[FirstName] + ' ' + COALESCE(p.[MiddleName], '') + ' ' + p.[LastName] AS [FullName] ,e.[JobTitle] ,st.[Name] AS [SalesTerritory] ,soh.[SubTotal] ,YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear] FROM [Sales].[SalesPerson] sp INNER JOIN [Sales].[SalesOrderHeader] soh ON sp.[BusinessEntityID] = soh.[SalesPersonID] INNER JOIN [Sales].[SalesTerritory] st ON sp.[TerritoryID] = st.[TerritoryID] INNER JOIN [HumanResources].[Employee] e ON soh.[SalesPersonID] = e.[BusinessEntityID] INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = sp.[BusinessEntityID]
W tym kroku zapiszemy nasz pierwszy plan wykonania. Kliknij prawym przyciskiem myszy w dowolnym miejscu planu wykonania i kliknij Zapisz plan wykonania jako i zapisz plan wykonania jako ExecutionPlan_CE140.sqlplan.
Teraz otworzymy nową zakładkę zapytania w SQL Server Management Studio i wykonamy poniższe zapytanie. W tym zapytaniu dodamy wskazówkę dotyczącą zapytania FORCE_LEGACY_CARDINALITY_ESTIMATION na końcu zapytania, co wymusza użycie starszej wersji modelu szacowania liczności.
Zadanie szacowania liczności jest przewidzenie, ile wierszy zwróci nasze zapytanie.
SELECT soh.[SalesPersonID] ,p.[FirstName] + ' ' + COALESCE(p.[MiddleName], '') + ' ' + p.[LastName] AS [FullName] ,e.[JobTitle] ,st.[Name] AS [SalesTerritory] ,soh.[SubTotal] ,YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear] FROM [Sales].[SalesPerson] sp INNER JOIN [Sales].[SalesOrderHeader] soh ON sp.[BusinessEntityID] = soh.[SalesPersonID] INNER JOIN [Sales].[SalesTerritory] st ON sp.[TerritoryID] = st.[TerritoryID] INNER JOIN [HumanResources].[Employee] e ON soh.[SalesPersonID] = e.[BusinessEntityID] INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = sp.[BusinessEntityID] OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'));
Klikniemy Porównaj plan pokazu i wybierz poprzedni plan wykonania, który został zapisany jako ExecutionPlan_CE140.sqlplan.
Poniższy obraz ilustruje pierwszy ekran porównania planu wykonania SQL Server, a podświetlone na różowo obszary definiują podobne operacje.
Jeśli klikniemy dowolny operator na ekranie planu wykonania poniżej lub powyżej, SQL Server Management Studio podświetli inne podobne operatory. Po prawej stronie panelu możesz znaleźć właściwości i szczegóły porównania właściwości.
W tym kroku zmienimy opcje ShowPlan Analysis i podświetlimy niezgodny operator. Na dole ekranu widzimy Analiza Showplan płyta. Jeśli wyczyścimy Podświetl podobne operacje i wybierz Wyróżnij operatory, które nie pasują do podobnych segmentów, SQL Server Management Studio wyróżnia niezrównany operator. Następnie kliknij Wybierz operatorów w poniższym i powyżej planie wykonania w panelu. SQL Server Management Studio porównuje właściwości wybranych operatorów i umieszcza znaki nierówności na nieidentycznych wartościach.
Jeśli przeanalizujemy ten ekran bardziej szczegółowo, pierwszą rzeczą jest Wersja modelu szacowania kardynalności różnica. Pierwsza wersja zapytania to 70, a druga to 140. Ta różnica wpływa na Szacowaną liczbę wierszy . Główny powód, który powoduje różną szacunkową liczbę wierszy to inna wersja szacowania kardynalności. W związku z tym wersja szacowania kardynacji ma bezpośredni wpływ na metryki szacunkowe zapytania. W przypadku tego porównania zapytań możemy stwierdzić, że zapytanie, którego wersja szacowania kardynacji ma wartość 140, działa lepiej, ponieważ szacowana liczba wierszy jest zbliżona do rzeczywistej liczby wierszy . Ten przypadek można wyjaśnić w poniższej tabeli.
[identyfikator tabeli=50 /]
Jeśli chcemy zobaczyć plany wykonania obok siebie na tym samym ekranie, możemy kliknąć Przełącz orientację rozdzielacza .
Teraz zrobimy kolejny pokaz. Przyjrzymy się poniższemu zapytaniu i porównamy plany wykonania przed i po utworzeniu indeksu.
Kiedy przyjrzymy się poniższemu planowi wykonania zapytania, zalecamy utworzenie indeksu nieklastrowanego.
SELECT [CarrierTrackingNumber] FROM [Sales].[SalesOrderDetail] WHERE [SalesOrderDetailID]=12
Zastosujemy zalecany indeks i ponownie wykonamy to samo zapytanie.
CREATE NONCLUSTERED INDEX Index_NC ON [Sales].[SalesOrderDetail] ([SalesOrderDetailID]) GO SELECT [CarrierTrackingNumber] FROM [Sales].[SalesOrderDetail] WHERE [SalesOrderDetailID]=12
W tym ostatnim kroku porównamy plany wykonania.
Na powyższym obrazku możemy uzyskać kilka informacji o planach wykonawczych. Ale główną różnicą jest operacja logiczna pole. Jednym z nich jest Poszukiwanie indeksu a drugi to Skanowanie indeksu a to zróżnicowanie operacji prowadzi do odmiennych szacunkowych i rzeczywistych wartości metryk. Ostatni ze wszystkich operatorów Index Seek działa lepiej niż operator Index Scan.
Wnioski
Jak wspomnieliśmy w artykule, funkcja Porównaj Showplan oferuje pewne korzyści programistom lub administratorom baz danych. Niektóre z nich można zaliczyć do:
- Proste porównanie dwóch różnic w planach wykonania.
- Proste wykrywanie problemów z wydajnością zapytań w różnych wersjach SQL Server.
- Proste wykrywanie problemów z wydajnością zapytań w różnych środowiskach.
- Po prostu wyjaśnia zmiany planu wykonania przed i po utworzeniu indeksu.
Referencje
- Oszacowanie kardynalności (SQL Server)
- Przewodnik po architekturze przetwarzania zapytań