SQL Server 2012 – Nowinki w planach wykonania
Ostatnimi czasy bardzo dużo mówię o funkcjonalnościach SQL Server 2012, którego premiera zbliża się wielkimi krokami (na razie, w oczekiwaniu na wersję RTM produktu, warto wziąć udział w pewnym wirtualnym wydarzeniu). I tak, demonstruję m.in. AlwaysOn (arcyciekawe nowe podejście do wysokiej dostępności), ColumnStore Index (“turbo boost” dla zapytań wykonywanych na hurtowni danych) czy Power View (nowe podejście do interaktywnego raportowania). Ale oprócz kluczowych funkcjonalności, spośród których niektóre wymieniłem, są też takie, które umykają naszej uwadze.
Jedną z takich funkcjonalności jest nowinka w planach wykonania – ostrzeżenia przed operacjami wykonywanymi w bazie tempdb. Chodzi o scenariusze, gdy podczas wykonywania zapytania grant pamięci dla wykonywanych operacji typu Sort lub Hash jest zbyt mały, by operacja mogła być wykonana w pamięci i SQL Server dokonuje zrzutu danych do bazy tempdb.
Zobaczmy przykład (zapożyczony częściowo od Ramesha Meyyappan):
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T; GO --Tworzymy tabelę CREATE TABLE #T ( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, Name char(1000) NOT NULL, Size int NOT NULL ); GO --Wstawiamy 10k wierszy INSERT INTO #T (Name, Size) SELECT 'Item ' + CONVERT(varchar(10), v2.number) + '(' + CONVERT(varchar(10), v1.number) + ')', v1.number FROM master.dbo.spt_values AS v1, master.dbo.spt_values AS v2 WHERE v1.type = 'P' AND v2.type = 'P' AND v1.number BETWEEN 1 AND 10 AND v2.number BETWEEN 1 AND 1000; GO --Upewniamy się, że statystyki są aktualne UPDATE STATISTICS #T WITH FULLSCAN; GO --Testowe zapytanie (Sort w tempdb) SELECT * FROM #T WHERE ID <= 7000 ORDER BY Size OPTION (MAXDOP 1); GO
Przed wykonaniem ostatniego polecenia (SELECT) włączamy pokazywanie planu wykonania i naszym oczom ukazuje się coś takiego:
Uwagę przykuwa znaczek ostrzeżenia na ikonie operatora Sort. Gdy najedziemy myszką na ów operator, pokazuje się karta właściwości, a na niej:
Otrzymujemy jasną przesłankę, że operacja została wykonana z użyciem tempdb. Analogiczne ostrzeżenia możemy dostać w przypadku wystąpienia operatora Hash. Do tej pory takie ostrzeżenia można było przechwycić w aplikacji SQL Server Profiler (przy założeniu, że włączyliśmy w trace zdarzenia Sort Warning i Hash Warning). Niby niewiele, a jednak ta nowinka cieszy, bo może oszczędzić sporo czasu poświęconego na zastanawianie się, czemu zapytanie wykonuje się dłużej niż oczekujemy, choć plan wykonania wygląda w porządku. Dla mnie bomba :-)
PS. W miarę możliwości postaram się w niedługim czasie napisać coś o wspomnianych kluczowych funkcjonalnościach SQL Server 2012. Stay tuned!

Nazywam się Paweł Potasiński i pracuję w polskim oddziale Microsoft w dziale Small and Midmarket Solutions & Partners (SMS&P) jako Partner Technology Advisor.





2012/02/15 - 08:09
Nice !!
Czekam na kolejne ciekawostki i nowinki.
Pozdrawiam.
2012/02/16 - 09:24
Nie wiem, czy dobrze rozumiem, dlatego zapytam: jakbyś miał więcej ramu dla mssql-a, to byś dla tych samych danych wykrzyknika nie zobaczył?
2012/02/20 - 11:37
@Artur: To nie tak. SQL Server przydziela pamięć do wykonania operacji takich jak Sort na podstawie estymowanych ilości i rozmiarów wierszy. Jeśli ta estymata jest w jakikolwiek sposób przekłamana, sortowane dane mogą nie zmieścić się w przydzielonej pamięci i następuje zrzucenie danych do bazy tempdb (zapis na dysk zamiast do pamięci – a więc wolniej). Na stronie wspomnianego Ramesha znajdziesz przykłady, jak można oszukać optymalizator i “powiększyć” estymaty.