Resource Governor a plany wykonania zapytań

Ostatnio zająłem się nieco dokładniej Resource Governorem w SQL Server i chciałbym się z wami podzielić pewnym spostrzeżeniem na temat zrównoleglonych planów zapytań.

Krótkie wprowadzenie

Zarządca zasobów w SQL Server został wprowadzony wraz z ukazaniem się SQL Server 2008. Jest to narzędzie pozwalające konfigurację limitów związanych z pamięcią RAM i procesorem. Dzięki niemu możemy zapobiec sytuacjom, w których jedna aplikacja zużywa większość zasobów serwera i tym samym spowalnia inne programy łączące się z tą samą instancją.

Jak skorzystać z  Resource Governor można przeczytać na stronach polskiego technetu: http://technet.microsoft.com/pl-pl/library/akademia-sql—czesc-2-resource-governor.aspx

Konfiguracja środowiska

Jedną z możliwości jakie daje na, zarządca zasobów w SQL Server jest ustawienie maksymalnej ilości wątków, w których mogą być wykonane instrukcje przypisane do danej WORKLOAD GROUP.  Aby to zrobić należy ustawić opcję MAX_DOP na odpowiednią wartość. Ja podczas swoich testów ustawiłem ją na jeden, zabraniając tym samym zrównoleglenia.

Przykładowy skrypt tworzący WORKLOAD GROUP i przypisujący ją do domyślnej puli zasobów przedstawiam poniżej:

CREATE WORKLOAD GROUP GrupaBezRownoleglosci2
WITH (
 MAX_DOP = 1 --zapytania tylko jednowątkowe
)
USING "default"

Aby móc z niej skorzystać należy utworzyć odpowiednią funkcję klasyfikującą:

CREATE FUNCTION dbo.fsKlasyfikator()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
 DECLARE @grupa sysname 

 SET @grupa = CASE WHEN ORIGINAL_LOGIN() = 'TestA' THEN 'GrupaBezRownoleglosci'
   ELSE 'default'
 END
RETURN @grupa
END

A następnie podpiąć ją do Resource Governora:

ALTER RESOURCE GOVERNOR
WITH ( CLASSIFIER_FUNCTION = dbo.fsKlasyfikator )

ALTER RESOURCE GOVERNOR
RECONFIGURE

Dodatkowo na potrzeby testów utworzony przez mnie wcześniej login TestA powinien mieć uprawnienie VIEW ANY DEFINITION na poziomie serwera:

GRANT VIEW ANY DEFINITION
TO TestA

Sprawdzamy czy działa 🙂

Po ukończonej konfiguracji łączymy się z instancją za pomocą loginu „TestA” i sprawdzamy wynik poniższego zapytania:

SELECT s.session_id, g.name
FROM sys.dm_exec_sessions s
JOIN sys.resource_governor_workload_groups g
ON s.group_id = g.group_id
WHERE s.session_id = @@SPID

Jak widać aktualne połączenie jest przypisane do naszej grupy zasobów.

Sprawdźmy w takim razie plan wykonania następującej instrukcji dla przykładowej bazy AdventureWorks:

SELECT *
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
ORDER BY Style

Na powyższym obrazku widać kilka miejsc, w których występuje zrównoleglenie. Dziwna sprawa, zważywszy na fakt, że sesja dla której sprawdziliśmy przewidywalny plan została przypisana do WORKLOAD GROUP z MAX_DOP = 1.

Wykonajmy zapytanie zaznaczając opcję „Include Actual Execution Plan”:

SELECT *
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
ORDER BY Style

Niestety wygląda podobnie. Operatory zrównoleglenia nadal wystepują.

Co się w takim razie stało, czyżby Resource Governor nie działał?

Na szczęście nie jest aż tak źle. Ogólnie rzecz ujmując Resource Governor zrobił swoje zadanie i dział wyśmienicie. To wyświetlany plan zapytania stwarza błędne wrażenie zrównoleglenia.  Aby się o tym przekonać należy kliknąć prawy przyciskiem na znacznik „Parallelism” przedstawionego wcześniej planu, co spowoduje wyświetlenie okienka z właściwościami tego operatora.

Na obrazku powyżej nie znajdziemy wartości związanych z wykonaniem, takich jak np. „Actual Number of Rows”. Oznacza to, że faktyczne operator ten nie został użyty. W przypadku gdybyśmy odpalili zapytanie dla WORKLOAD GROUP pozwalającej na zrównoleglenie, to właściwości tego operatora wyglądałyby następująco:

Podsumowanie

Resource Governor jest całkiem fajnym narzędziem pozwalającym na dostosowanie zarządzanej instancji do naszych potrzeb. Analizując plany zapytań należy jednak wziąć poprawkę na to, że wykonanie instrukcji może zostać zmienione i nie wszystkie wyświetlone operatory zostaną wykonane. Taka sytuacja ma miejsce, gdy np. zabronimy zrównoleglenia wykonania dla wybranej grupy obciążeniowej.

Reklamy

Posted on 27 marca 2012, in SQL Server and tagged , . Bookmark the permalink. Dodaj komentarz.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Connecting to %s

%d blogerów lubi to: