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:

image

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:

image

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!