DBCC FreeProcCache

 descărcați PDF

fiind ziua 12 a lunii de comandă DBCC la SteveStedman.com, comanda DBCC prezentată astăzi este DBCC FREEPROCCACHE.

descriere:

DBCC FREEPROCCACHE este folosit pentru a curăța toate planurile de interogare analizate din memorie. Acest lucru este utilizat în mod obișnuit în mediile de dezvoltare, dar nu la fel de obișnuit într-un mediu de producție.

utilizarea într-un mediu de dezvoltare este obișnuită, de exemplu atunci când lucrați la reglarea performanței sau parametrizarea interogărilor. Puteți șterge memoria cache a procedurii cu DBCC FreeProcCache, rulați programul sau pagina web care poate utiliza baza de date, apoi vedeți ce se află în memoria cache a procedurii. Acest lucru poate fi util în găsirea interogărilor care ar putea necesita parametrizarea. Un alt mod de a utiliza ar fi pentru a afla ce interogări sunt conduse de un program. Pentru a face acest lucru, veți începe prin a lucra cu o bază de date care nu este utilizată de alții, ștergând memoria cache a procedurii cu DBCC FreeProcCache, apoi rulați programul pe care încercați să-l dați seama, apoi uitați-vă la ceea ce este în memoria cache, din nou, acest lucru ar putea fi făcut într-un mediu de dezvoltare sau testare, dar nu aș recomanda să o faceți în producție.

utilizarea într-un mediu de producție ar trebui să fie rară, acesta este unul dintre lucrurile obișnuite de încercat atunci când SQL Server are dificultăți. Dacă sunteți punctul în care SQL Server răspunde extrem de lent și nu ați reușit să găsiți cauza, un lucru de încercat este să eliberați memoria cache a procedurii cu DBCC FreeProcCache și să vedeți dacă aceasta rezolvă problema.

sintaxa DBCC FreeProcCache:

dbcc freeproccache

exemplu:

următorul exemplu este dintr-un mediu de dezvoltare folosind baza de date AdventureWorks2012.

mai întâi ne conectăm la AdventureWorks2012 și vedem ce este în cache.

USE AdventureWorks2012;GOSELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;

DBCC_FreeProcCache1
aici vedem că există o mulțime în cache. Apoi ștergem memoria cache cu DBCC FreeProcCache și aruncăm o altă privire la ceea ce este în memoria cache.

DBCC FREEPROCCACHE;SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;

după rularea DBCC FreeProcCache puteți vedea că nu mai rămâne nimic în cache.
DBCC_FreeProcCache2 când următoarea interogare este executată, va trebui să fie reparată mai degrabă decât să se utilizeze o interogare deja analizată în memoria cache. Acest lucru va dura un pic mai mult decât dacă ar exista deja un plan analizat pentru a rula. Permite rula 3 interogări, apoi să ia o privire la cache-ul.

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';

observați Declarația GO între fiecare interogare. Acest lucru spune SSMS pentru a rula fiecare interogare ca un lot separat. Fără declarația GO, interogările 3 ar fi fost analizate ca un singur lot.
DBCC_FreeProcCache3
aici vedem rezultatele celor trei întrebări. Primele două rezultate au revenit, iar al treilea nu a avut rânduri în setul de rezultate. Acum, să aruncăm o privire la cache

SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;

mai jos vom vedea un total de 20 de elemente în cache acum. elementul de sus evidențiat în albastru este interogarea pe care am folosit-o pentru a vedea ce se află în cache, al doilea bloc evidențiat în roșu conține cele 3 interogări de mai sus, iar al treilea restul sunt interogări rulate de SQL sau alte interogări de susținere. De exemplu, linia 13 este dm_exec_sql_text care este apelat din interogarea de mai sus care verifică planul.DBCC_FreeProcCache4

dacă am vrut să filtrăm acest lucru doar la interogările pe care le-am scris, ați putea să o faceți adăugând o clauză WHERE text LIKE … la interogare așa cum se arată aici.

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%';

aici vedem că numai cele trei interogări apar și că fiecare dintre aceste trei ocupă aproximativ 40K de memorie pe SQL Server. DBCC_FreeProcCache5deci, de ce există trei copii ale aceleiași declarații SELECT, acest lucru pare un pic risipitor. Într-adevăr, nu, pentru mai multe informații a se vedea un post mai devreme numit cât de mult procedura de memorie Cache are o declarație SQL dura până? Există modalități de a corecta acest lucru.

utilizarea DBCC FreeProcCache pentru un anumit mâner Plan

dacă ați vrut să ștergeți doar un singur mâner plan, și nu toate mânerele plan, ai putea folosi parametrul opțional numit @mâner.

pentru a obține mânerul planului, începem prin modificarea interogării noastre anterioare pentru a ne arăta ce este în memoria cache a planului. Ați putea lăsa clauza WHERE pe propriul dvs. sistem, dar o am aici pentru a ne arăta doar cele trei întrebări în cauză de mai sus.

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%';

DBCC_FreeProcCache7

aici vedem aceleași trei planuri de interogare de mai devreme, cu o coloană de adăugare numită plan_handle. Pentru a elibera un singur mâner plan, ne-ar copia doar mânerul plan numeric, și se adaugă că în interogarea 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%';

DBCC_FreeProcCache8

unde vedem doar 2 din cele trei interogări originale în memoria cache a planului.

cât de mare este memoria cache a procedurii mele?

puteți rula următoarea interogare pentru a verifica dimensiunea cache-ului de 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;

care produce următoarele rezultate pe serverul meu de testare.

DBCC_FreeProcCache9

rapoartele de sănătate ale bazei de date și memoria cache a planului

de asemenea, puteți vizualiza memoria cache a planului utilizând aplicația rapoarte de sănătate a bazei de date, așa cum se arată aici.

DBCC_FreeProcCache10

Note:

pentru mai multe informații, consultați TSQL Wiki DBCC freeproccache.

DBCC lună de comandă la SteveStedman.com este aproape la fel de distractiv ca și consumul de jeleu.


 SteveStedman5
Steve și echipa de la Stedman Solutions sunt aici pentru toate nevoile SQL Server.
Contct – ne astăzi pentru consultația gratuită de 30 de minute..
suntem gata să ajutăm!



+