Query hint MAXDOP. Opcja serwera ‚max degree of parallelism’. Wykorzystanie wielu procesorów w zapytaniu.

10-Mar-2011

Oczywiście do wykonywania zapytań konieczna jest praca procesora… Miło by też było gdyby podczas wykonywania zapytań serwer rzeczywiście wykorzystywał kilka procesorów na raz! Reguluje tym parametr ‘max degree of parallelism’. Jest to wartość całkowita, która mówi ile procesorów jednocześnie może maksymalnie wykonywać jedno zapytanie. Nie regulujesz nim ile procesorów rzeczywiście wykona zapytanie, a jedynie określasz im maksymalną dopuszczalną liczbę.

  • Wartość 0 mówi, że serwer ma sam decydować ile procesorów sobie wykorzysta
  • Wartość 1 mówi, że maksymalnie można wykorzystać tylko 1 procesor
  • Wartość 2 mówi, że jednocześnie mogą nad jednym zapytaniem pracować 2 procesory
  • Itd.
  • I tak aż do 32.

Najważniejszym limitem przy ustawianiu tej wartości jest:

  •  Ilość rzeczywiście istniejących w systemie procesorów (no oczywiście ;))
  •  Wersja SQL Serwera:
    •  Express, zawsze pracuje na 1 procesorze
    •  Workgroup może wykorzystywać 2
    •  Web i Standard 4
    •  Enterprise – 32

Jeżeli podczas wykonania pojedynczego zapytania, chcesz przedefiniować tę wartość to można użyć query hint. Wartość podana przez query hint jest ważniejsza niż parametr określony przez ‘max degree of parallelism’, podlega jednak tym samym ograniczeniom! Oto jak możesz zmienić wartość ‘max degree of parallelism’:

EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'max degree of parallelism', 3
GO
RECONFIGURE
GO

Aby podczas określonego zapytania nie używać jednak aż 3 procesorów, a maksymalnie jedynie 2 można użyć query hint, który mógłby wyglądać następująco:

SELECT * FROM dbo.KPSlRodzPrzy p 
JOIN dbo.XSlSkPl x on x.KodPrzych=p.KodPrzych 
OPTION (MAXDOP 2)

Zauważmy jeszcze, że jeżeli jest zdefiniowany Resource Governor, to hint przekazany w zapytaniu nie może przekroczyć limitu przydzielonego przez Resource Governor. Śmiało jednak, może przekroczyć limit określony opcjami serwera.

Opcja MAXDOP działa także podczas budowania indeksu. Poniższe polecenie przebuduje indeksy na tabeli wykorzystując do tego maksymalnie dwa procesory:

ALTER INDEX ALL ON dbo.KpSlRodzPrzy REBUILD WITH (MAXDOP = 2)

Zabawy z query hint nie należą jednak do najbardziej lubianych przez programistów baz danych. Dlaczego!? Bo jeżeli nawet w danym momencie określony query hint przyśpieszy wykonanie zapytania, to za jakiś czas, kiedy rozkład danych ulegnie zmianie, może się okazać, że wykonanie zapytania w taki sposób jak to sobie wymyślił serwer SQL jest lepsze niż to, które zaproponowałeś wpisując wskazówki. Niestety zapytanie będzie wędrować do serwera z Twoim query hint i optymalizator będzie miał związane ręce. Lepiej, więc poświęcić nieco czasu i odnaleźć przyczynę wolnego wykonania zapytań, zmienić procedurę, zastanowić się, dlaczego serwer nie chciał sam z siebie wykorzystać większej liczby procesorów, niż od razu zmuszać go do przyjęcia query hint.

Wiecej przydatnych uwag na ten temat znajdziesz np tutaj: http://wss.pl/frmThread.aspx?tid=70463

Dodaj komentarz:

Autor: Rafał Kraik