Cache planów wykonania w MS SQL Server (procedure cache)

29-lis-2010

Kiedy po raz pierwszy wykonujesz określone zapytanie w SQL serwerze, jest dla tego zapytania tworzony plan zapytania (Execution plan). Właściwie to nawet nie jeden execution plan, ale wiele, a wszystko po to aby potem spośród tych wielu planów wybrać najardziej optymalny. Ten najlepszy plan wykonania jest następnie komilowany i przechowywany na w procedure cache.

Kiedy to zapytanie wykonujesz kolejny raz, serwr nie musi na nowo przeprowadzać selekcji nowego planu wykonania, ani go kompilować. Może skorzystać z odłożonego wcześniej planu i skompilowanej procedury w procedure cache.

Jak sprawdzić przebieg tego procesu?

Jest w serwerze specjalny widok dynamiczny zwany sys.dm_exec_query_stats. Kolumna execution_count mówi ile razy dany plan wykonania został użyty. Zapytaniem:

SELECT * FROM sys.dm_exec_query_stats

można sprawdzić czy istnieją jakieś procedury wykonywane częściej niż inne. Nie wierzysz? Wpisz w innej sesji polecenie:

USE AdventureWorks2008;
GO:
WHILE 1=1
BEGIN
SELECT * FROM Person.Person
END;
GO;

Wróć teraz do poprzedniej sesji i zobacz jak jeden z rekordów przyjmuje coraz większą wartość w kolumnie execution_count! To właśnie wyżej zapisane zapytanie wywoływane w nieskończonej pętli.

Przy okazji – polecenie

dbcc freeproccache

powoduje opróżnienie procedure cache. Jeżeli jednak wykonasz to polecenie na maszynie produkcyjnej, to teraz serwer trochę się zmęczy, żeby znowu wymyślić na nowo wszystkie plany wykonania…

Komentarze są wyłączone

Autor: Rafał Kraik