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…