będąc 12 dniem miesiąca polecenia DBCC w SteveStedman.com, dzisiejsze polecenie DBCC to DBCC FREEPROCCACHE.
opis:
DBCC FREEPROCCACHE służy do usuwania wszystkich parsowanych planów zapytań z pamięci. Jest to powszechnie stosowane w środowiskach programistycznych, ale nie tak powszechne w środowisku produkcyjnym.
użycie w środowisku programistycznym jest powszechne, na przykład podczas pracy nad strojeniem wydajności lub parametryzacją zapytań. Możesz wyczyścić pamięć podręczną procedury za pomocą DBCC FreeProcCache, uruchomić program lub stronę internetową, która może używać bazy danych, a następnie zobaczyć, co znajduje się w pamięci podręcznej procedury. Może to być przydatne w wyszukiwaniu zapytań, które mogą wymagać parametryzacji. Innym sposobem użycia byłoby dowiedzieć się, jakie zapytania są uruchamiane przez jakiś program. Aby to zrobić, zacznij od pracy z bazą danych, która nie jest używana przez innych, wyczyszczenie pamięci podręcznej procedury za pomocą DBCC FreeProcCache, następnie uruchom program, który próbujesz dowiedzieć się, a następnie spójrz na to, co jest w pamięci podręcznej, ponownie jest to coś, co można zrobić w środowisku programistycznym lub testowym, ale nie polecam robienia tego w produkcji.
użycie w środowisku produkcyjnym powinno być rzadkie, jest to jedna z typowych rzeczy do wypróbowania, gdy SQL Server ma problemy. Jeśli chodzi o to, że SQL Server reaguje bardzo wolno i nie udało ci się znaleźć przyczyny, jedną z rzeczy do wypróbowania jest uwolnienie pamięci podręcznej procedury za pomocą DBCC FreeProcCache i sprawdzenie, czy to rozwiązuje problem.
składnia DBCC FreeProcCache:
dbcc freeproccache
przykład:
poniższy przykład pochodzi z środowiska programistycznego wykorzystującego bazę danych AdventureWorks2012.
najpierw łączymy się z AdventureWorks2012 i sprawdzamy co jest w pamięci podręcznej.
USE AdventureWorks2012;GOSELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
tutaj widzimy, że jest dużo w schowku. Następnie wyczyścimy pamięć podręczną za pomocą DBCC FreeProcCache i przyjrzymy się jeszcze raz temu, co znajduje się w pamięci podręcznej.
DBCC FREEPROCCACHE;SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
po uruchomieniu DBCC FreeProcCache możesz zobaczyć, że nic nie zostało w pamięci podręcznej.
gdy zostanie uruchomione następne zapytanie, będzie ono musiało zostać naprawione, zamiast używać już przetworzonego zapytania w pamięci podręcznej. Potrwa to nieco dłużej, niż gdyby istniał już parsowany plan uruchomienia. Uruchom 3 zapytania, a następnie przyjrzyj się pamięci podręcznej.
GOSELECT FirstName, MiddleName, LastName FROM person.Person p WHERE FirstName like 'John';GOSELECT FirstName, MiddleName, LastName FROM person.Person p WHERE FirstName like 'Mary';GOSELECT FirstName, MiddleName, LastName FROM person.Person p WHERE FirstName like 'Bill';
zwróć uwagę na polecenie GO pomiędzy każdym zapytaniem. To mówi SSMS, aby uruchomić każde zapytanie jako oddzielną partię. Bez instrukcji GO zapytania 3 byłyby parsowane jako jedna partia.
tutaj widzimy wyniki z trzech zapytań. Pierwsze dwa zwracały wyniki, a trzeci nie miał rzędów w zestawieniu wyników. Teraz rzućmy okiem na cache
SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
poniżej widzimy w sumie 20 pozycji w cache teraz. górny element podświetlony na niebiesko to zapytanie, którego użyliśmy do sprawdzenia, co było w pamięci podręcznej, drugi blok podświetlony na Czerwono zawiera 3 zapytania z góry, a trzecia reszta to zapytania uruchamiane przez SQL lub inne zapytania pomocnicze. Na przykład linia 13 jest dm_exec_sql_text, która jest wywoływana z powyższego zapytania, które sprawdza plan.
gdybyśmy chcieli odfiltrować to tylko do zapytań, które napisaliśmy, możesz to zrobić, dodając do zapytania tekst jak…, jak pokazano tutaj.
SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stWHERE text LIKE N'SELECT FirstName%';
tutaj widzimy, że pojawiają się tylko trzy zapytania, a każde z tych trzech zajmuje około 40K pamięci na serwerze SQL. więc dlaczego są trzy kopie tego samego Oświadczenia SELECT, to wydaje się trochę marnotrawstwem. Rzeczywiście, aby uzyskać więcej informacji, zobacz wcześniejszy post o nazwie ile pamięci podręcznej procedury zajmuje jedna instrukcja SQL? Istnieją sposoby, aby to poprawić.
używanie DBCC FreeProcCache dla określonego uchwytu planu
jeśli chcesz wyczyścić tylko jeden uchwyt planu, a nie wszystkie uchwyty planu, możesz użyć opcjonalnego parametru o nazwie @handle.
aby uzyskać uchwyt planu, zaczynamy od modyfikacji naszego wcześniejszego zapytania, aby pokazać nam, co znajduje się w pamięci podręcznej planu. Możesz pominąć klauzulę WHERE we własnym systemie, ale mam ją tutaj, aby pokazać nam tylko trzy pytania z góry.
SELECT size_in_bytes, text, plan_handle FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stWHERE text LIKE N'SELECT FirstName%';
tutaj widzimy te same trzy plany zapytań z wcześniejszych, z dodatkową kolumną o nazwie plan_handle. Aby uwolnić Pojedynczy Uchwyt planu, po prostu skopiujemy numeryczny uchwyt planu i dodamy go do zapytania DBCC FreeProcCache.
DBCC FREEPROCCACHE(0x060007000100FF3310B8DA7D0600000001000000000000000000000000000000000000000000000000000000);SELECT size_in_bytes, text, plan_handle FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stWHERE text LIKE N'SELECT FirstName%';
gdzie widzimy tylko 2 z trzech oryginalnych zapytań w pamięci podręcznej planu.
jak duży jest mój Cache procedury?
możesz uruchomić następujące zapytanie, aby sprawdzić rozmiar bufora procedur.
SELECT count(*) AS NumPlans, objtype as Type,SUM(size_in_bytes)/(1024.0*1024.0) AS size_in_mbFROM sys.dm_exec_cached_plansGROUP BY objtype;
który daje następujące wyniki na moim serwerze testowym.
raporty stanu bazy danych i pamięć podręczna planu
możesz również wyświetlić pamięć podręczną planu za pomocą aplikacji raporty stanu bazy danych, jak pokazano tutaj.
uwagi:
aby uzyskać więcej informacji, zobacz TSQL Wiki DBCC freeproccache.
DBCC Command month at SteveStedman.com to prawie tak samo zabawne, jak jedzenie galaretki.
Steve i zespół Stedman Solutions są tutaj dla wszystkich potrzeb serwera SQL.
skontaktuj się z nami już dziś, aby uzyskać bezpłatną 30-minutową konsultację..
jesteśmy gotowi pomóc!