SQL Server 2012 i nie tylko: wstęp do planów

advertisement
SQL SERVER 2012 i
nie tylko:
Wstęp do planów zapytań
Cezary Ołtuszyk
coltuszyk.wordpress.com
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Kilka słów o mnie

Starszy Administrator Baz Danych w firmie
BEST S.A. (Bazy danych > 1TB)

Konsultant z zakresu SQL Server
(tuning, troubleshooting, wirtualizacja)

Posiadacz certyfikatów MCITP/MCTS z dziedziny
SQL Server, HYPER-V, Windows Server …

Prelegent na konferencjach informatycznych i
spotkaniach grup pasjonackich

Autor artykułów i blogger
(wss.pl, coltuszyk.wordpress.com)
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Plan spotkania
I.
Wprowadzenie do tematu (mierzenie wydajności)
II.
Czytanie i wybieranie danych
III.
Łączenie tabel
IV.
Grupowanie i sortowanie wartości
V.
Podsumowanie
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Wprowadzenie do tematu (mierzenie wydajnosci)
Jednym często zadawanych pytań podczas
tworzenia
oprogramowania
jest
następujące zdanie:
„Dlaczego moje zapytanie trwa tak długo?”
Niestety nie
odpowiedzi …
ma
na
nie
uniwersalnej
Są natomiast narzędzia, które pozwalają
nam znaleźć odpowiedź dla danego
przypadku.
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Wprowadzenie do tematu (mierzenie wydajności)
Zanim
zaczniemy
poprawiać
nasze
zapytania, powinniśmy wiedzieć jak można
mierzyć ich wydajność:

Czas wykonania zapytań SQL

Ilość odczytanych danych

Czas zajętości procesora

Plan wykonania instrukcji
Plany wykonania są zarówno miarą jak i
wyjaśnieniem zagadki związanej z wydajnością 
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Czytanie danych
Podstawową jednostką zapisu i odczytu w SQL Server jest strona,
która zawiera 8KB danych. Czytając dane z tabeli, tak naprawdę
(fizycznie) czytamy 8KB strony.
Data Pages
Page 1
Page 2
Page 3
Page 4
Con ...
Funk ...
Woods ...
...
...
...
...
Russo ...
Woods ...
Barr ...
...
...
...
...
Akers ...
Funk ...
Smith ...
Martin ...
...
...
Smith
Owen
Jones
...
...
...
...
...
...
...
Page 5
Page 6
Martin ...
Pica ...
Jones ...
Smith ...
...
...
Ganio
Jones
Hall
...
...
...
...
...
...
...
Nasze zabiegi związane z przyśpieszeniem odczytu będą wiązały się
ze zmniejszeniem ilość stron, które należy przeczytać aby wybrać
interesujące nas informacje.
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Czytanie danych
Operatory „Table Skan”, „Clustered Index Scan” i
„Index Scan” świadczą o tym, że SQL Server
czyta cały indeks lub całą tabelę w celu podania
interesujących nas wartości.
Przeciwieństwem operatorów skanujących są
operacje typu „Seek”. Operatory „Clustered Index
Seek” oraz „Index Seek” mówią nam, że silnik baz
danych wie, gdzie znajdują się odpowiednie dane.
Nowością wprowadzoną w SQL Server 2012 jest
operator „Columnstore Index Scan”. W przypadku,
gdy wybieramy dużą ilość danych z hurtowni, to
będzie to prawdopodobnie najefektywniejsza
metoda dostępu.
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Łączenie tabel
Pierwszą rzeczą jaką trzeba powiedzieć na temat
łączenia tabel jest rozróżnienie logicznego
operatora
łączenia
od
jego
fizycznej
implementacji.
Logiczne operatory łączenia to: INNER JOIN,
LEFT JOIN, RIGHT JOIN, FULL JOIN i CROSS
JOIN. Są one używane podczas tworzenia
instrukcji T-SQL.
W momencie wykonania SQL Server realizując
dane łączenie logiczne korzysta z jednego z trzech
operatorów fizycznych: „Nested Loops”, „Hash
Match”, „Merge Join”
Przykład: Programista napisał instrukcję zawierającą łączenie
logiczne LEFT JOIN, SQL Server aby podać wynik użył
operatora „Nested Loops”
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Łączenie tabel
Łączenie tabel za pomocą operatora „Nested
Loops” polega na wybraniu odpowiedniego wiersza
z tabeli A, a następnie przeszukaniu tabeli B w
celu znalezienia pasujących wierszy.
Ci z was, którzy zetknęli się z algorytmiką już się
pewnie
domyślają
jaka
jest
złożoność
obliczeniowa tego rozwiązania ( A x B) i kiedy
plan używający „Nested Loops” jest optymalny.
Przykład:
Dwie tabele po 1000 rekordów mogą dać łącznie milion porównań
podczas łączenia „Nested Loops”(1000*1000 = 1000000)
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Łączenie tabel
Algorytm łączenia za pomocą operatora „Hash
Match” wygląda następująco:
1. Pobierane są dane z tabeli A, dla których SQL
Server używa funkcji haszującej w celu
zbudowania odpowiednich kubełków
2. Pobierane są kolejne wiersze tabeli B, dla
których wyliczana jest ta sama funkcja
haszująca w celu dopasowania do odpowiedniego
kubełka (tabeli A)
3. Dane tabeli A i B są łączone wewnątrz kubełków
w celu podania wyniku
Co nam daje takie podejście?
- Mniej porównań podczas łączenia !!! (i większe zużycie procesora) 
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Łączenietabel
Łączenie tabel za pomocą operatora „Merge Join”
można porównać do działania algorytmu sortowania
przez scalanie:
0. Obie tabele muszą być posortowane !!!!
1. Pobieramy pierwszy wiersz z tabeli A i
porównujemy go z pierwszym wierszem tabeli B
2. Jeżeli porównywalne wartość jest równa, to
brane wiersz jest dodawany do wyniku
3. Jeżeli wartości są różne, to wartość mniejsza
jest odrzucana na rzecz kolejnego wiersza
danej tabeli
Główna zaleta: liniowa złożoność obliczeniowa 
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Grupowanie i sortowanie wartości
Grupowanie w SQL Server może nastąpić na dwa
sposoby:
1. Za pomocą operacji „Stream Aggregate”, która
polega na zgrupowaniu wcześniej posortowanych
wartości
2. Z użyciem funkcji haszującej („Hash Match”),
która grupuje dane do odpowiednich kubełków,
a następnie wyliczy agregację
W momencie, gdy dysponujemy już wstępnie
posortowanymi wartościami (np. pobierając dane z
odpowiednio przygotowanego indeksu), to operacja
„Stream Aggregate” jest szybsza.
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Grupowanie i sortowanie wartości
Sortowanie danych może się odbywać w sposób
„jawny”, lub też „ukryty” przed programistą:
1. Sposób „jawny” polega na użyciu specjalnego
operatora „Sort”, który poukłada rekordy
według zadanych kryteriów
2. Sposób „niejawny” to po prostu przeczytanie
danych z indeksu, który ma logiczny porządek
zgodny z naszymi wymaganiami
Zadanie:
Czy instrukcja typu „SELECT * FROM tabela” zwróci rekordy
ułożone w określonym porządku? (np. posortowane wg. klucza
głównego tabeli)
Bazując na planach zapytań można poznać odpowiedź 
SQL Server 2012 i nie tylko: wstęp do planów zapytań
Podsumowanie
 Graficzne
plany
wykonania
są
doskonałym narzędziem pozwalającym
na badanie problemów wydajnościowych
kodu SQL
 Analizując plany zapytań zwróćmy
uwagę na to, czy nie czytamy zbyt dużej
ilości niepotrzebnych danych
 Każdy z fizycznych operatorów łączenia
tabel jest OK, pod warunkiem, że
korzystamy z niego w odpowiednich
sytuacjach
 Operacje grupowania i
potrafią
bazować
na
„przygotowaniu” rekordów
sortowania
wstępnym
Download