Å være dag 12 AV Dbcc Kommandoen måned på SteveStedman.com, dagens utvalgte Dbcc Kommando ER DBCC FREEPROCCACHE.
Beskrivelse:
DBCC FREEPROCCACHE brukes til å tømme alle analyserte spørringsplaner ut av minnet. Dette brukes ofte i utviklingsmiljøer, men ikke så vanlig i et produksjonsmiljø.
Bruk i et utviklingsmiljø er vanlig, for eksempel når du arbeider med ytelsesjustering eller parameterisering av spørringer. Du kan fjerne prosedyren cache MED Dbcc FreeProcCache, kjøre programmet eller nettside som kan bruke databasen, så se hva som er i prosedyren cache. Dette kan være nyttig for å finne spørringer som kanskje må parameteriseres. En annen måte å bruke ville være å finne ut hva spørringer blir drevet av noen program. For å gjøre dette vil du begynne å jobbe med en database som ikke brukes av andre, rydde prosedyrebufferen med Dbcc FreeProcCache, kjør deretter programmet du prøver å finne ut, så se på hva som er i hurtigbufferen, igjen er dette noe som kan gjøres i et utviklings-eller testmiljø, men jeg vil ikke anbefale å gjøre det i produksjon.
Bruk i et produksjonsmiljø bør være sjelden, dette er en av de vanlige tingene å prøve NÅR SQL Server har problemer. HVIS DU er poenget AT SQL Server er ekstremt treg til å svare, og du har ikke klart å finne årsaken, er det en ting å prøve å frigjøre prosedyrebufferen MED Dbcc FreeProcCache og se om det løser problemet.
Dbcc Freeprocache Syntaks:
dbcc freeproccache
Eksempel:
følgende eksempel er fra et utviklingsmiljø ved Hjelp Av AdventureWorks2012-Databasen.
først kobler vi Til AdventureWorks2012 og ser hva som er i hurtigbufferen.
USE AdventureWorks2012;GOSELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
Her ser vi at det er mye i cachen. Deretter rydder vi cachen MED Dbcc Freeprocache og tar en titt på hva som er i cachen.
DBCC FREEPROCCACHE;SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
etter å ha kjørt Dbcc FreeProcCache kan du se at det ikke er noe igjen i hurtigbufferen.
når den neste spørringen kjøres, må den repareres i stedet for å bruke en allerede analysert spørring i hurtigbufferen. Dette vil ta litt lengre tid enn om det allerede var en analysert plan å kjøre. Lar kjøre 3 spørringer, så ta en titt på cache.
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';
Legg Merke TIL GO-Setningen mellom hver spørring. DETTE forteller SSMS å kjøre hver spørring som en separat batch. Uten GO-setningen ville 3-spørringene blitt analysert som en enkelt batch.
her ser vi resultatene fra de tre spørringene. De to første ga resultater, og den tredje hadde ingen rader i resultatsettet. Nå kan vi ta en titt på cache
SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
Nedenfor ser vi totalt 20 elementer i cache nå. det øverste elementet uthevet i blått er spørringen vi pleide å se hva som var i hurtigbufferen, den andre blokken uthevet i rødt inneholder 3-spørringene ovenfra, og den tredje resten av dem er spørringer som kjøres AV SQL eller andre støttespørringer. For eksempel linje 13 er dm_exec_sql_text som kalles fra spørringen ovenfor som sjekker planen.
hvis vi ønsket å filtrere dette ned til bare spørringene vi hadde skrevet, kunne du gjøre det ved å legge TIL EN WHERE text LIKE … – setning til spørringen som vist her.
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%';
her ser vi at bare de tre spørringene dukker opp, og at hver av de tre tar opp OMTRENT 40K minne på SQL Server. Så hvorfor er det tre kopier av samme SELECT-setning, dette virker litt sløsing. Faktisk gjør det, for mer informasjon, se et tidligere innlegg kalt Hvor mye Prosedyrebufferminne tar EN SQL-Setning opp? Det finnes måter å rette opp dette på.
Bruke Dbcc FreeProcCache For Et Bestemt Planhåndtak
hvis du vil fjerne bare et enkelt planhåndtak, og ikke alle planhåndtakene, kan du bruke den valgfrie parameteren @handle.
for å få planhåndtaket, starter vi med å endre vår tidligere spørring for å vise oss hva som er i planbufferen. Du kan legge UT WHERE-klausulen PÅ ditt eget system, men jeg har det her for å vise oss bare de tre spørsmålene i spørsmålet ovenfra.
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%';
Her ser vi de samme tre spørringsplanene fra tidligere, med en tilleggskolonne kalt plan_handle. For å frigjøre et enkelt planhåndtak, ville vi bare kopiere det numeriske planhåndtaket, og legge det til DBCC FreeProcCache-spørringen.
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%';
Der vi bare ser 2 av de tre opprinnelige spørringene i planbufferen.
hvor Stor Er Prosedyrebufferen min?
du kan kjøre følgende spørring for å kontrollere størrelsen på prosedyrebufferen.
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;
som produserer følgende resultater på testserveren min.
Databasehelserapporter Og Planbufferen
du kan også vise planbufferen ved hjelp Av Programmet Database Health Reports, som vist her.
Merknader:
FOR MER informasjon, se TSQL Wiki dbcc freeproccache.
Dbcc Kommando måned på SteveStedman.com er nesten like gøy som å spise jello.
Steve og teamet På Stedman Solutions er her for ALLE DINE SQL Server behov.
Contct oss i dag for din gratis 30 minutters konsultasjon..
Vi er klare til å hjelpe!