Being day 12 of the DBCC Command month at SteveStedman.com, tänään esillä DBCC komento on DBCC FREEPROCCACHE.
Description:
DBCC FREEPROCCACHEA käytetään kaikkien jäsennettyjen kyselysuunnitelmien puhdistamiseen muistista. Tätä käytetään yleisesti kehitysympäristöissä, mutta ei yhtä yleisesti tuotantoympäristössä.
käyttö kehitysympäristössä on yleistä esimerkiksi suorituksen viritystä tai kyselyiden parametrisointia työstettäessä. Voit tyhjentää menettelyn välimuisti DBCC FreeProcCache, suorita ohjelma tai web-sivu, joka voi käyttää tietokantaa, sitten nähdä, mitä on menettelyn välimuisti. Tästä voi olla hyötyä etsittäessä kyselyitä, joita voidaan joutua parametrisoimaan. Toinen tapa käyttää olisi selvittää, mitä kyselyitä ajetaan jokin ohjelma. Voit tehdä tämän voit aloittaa työskentelemällä tietokanta, jota ei käytetä muut, clearing menettely välimuisti DBCC FreeProcCache, suorita ohjelma yrität selvittää, sitten katsoa, mitä on välimuisti, jälleen tämä on jotain, joka voitaisiin tehdä kehitys-tai testausympäristö, mutta en suosittele tekemään sitä tuotannossa.
käyttö tuotantoympäristössä on harvinaista, tämä on yksi yleisimmistä asioista kokeilla, kun SQL Server on vaikeuksia. Jos olet ovat piste, että SQL Server on erittäin hidas vastaamaan ja et ole pystynyt löytämään syy, yksi asia yrittää on vapauttaa menettelyn välimuisti DBCC FreeProcCache ja katso, jos se korjaa ongelman.
DBCC FreeProcCache syntaksi:
dbcc freeproccache
esimerkki:
seuraava esimerkki on kehitysympäristöstä, joka käyttää AdventureWorks2012-tietokantaa.
ensin yhdistämme AdventureWorks2012: een ja katsomme, mitä kätkössä on.
USE AdventureWorks2012;GOSELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
Tässä näemme, että kätkössä on paljon. Seuraavaksi selvitämme välimuistin DBCC Freeproccachen kanssa ja katsomme uudelleen, mitä välimuistissa on.
DBCC FREEPROCCACHE;SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
ajettuasi DBCC Freeproccachen näet, ettei välimuistissa ole enää mitään jäljellä.
kun heti seuraava kysely ajetaan, se on korjattava sen sijaan, että käytettäisiin jo jäsennettyä kyselyä välimuistissa. Tämä kestää hieman kauemmin kuin jos olisi jo jäsennelty suunnitelma juosta. Lets ajaa 3 kyselyt, sitten katsomaan välimuisti.
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';
huomaa GO-lauseke jokaisen kyselyn välissä. Tämä kertoo SSMS suorittaa jokaisen kyselyn erillisenä eränä. Ilman GO lausuma 3 kyselyt olisi jäsennelty yhtenä eränä.
tässä on kolmen kyselytutkimuksen tulokset. Kaksi ensimmäistä palasivat tulokseen, ja kolmannella ei ollut rivejä tulosjoukossa. Nyt Katsotaanpa välimuistia
SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
alla näemme yhteensä 20 kohdetta välimuistissa nyt. ylin kohde korostettu sininen on kysely käytimme nähdä, mitä oli välimuisti, toinen lohko korostettu punaisella sisältää 3 kyselyt ylhäältä, ja kolmas loput niistä ovat kyselyt suoritetaan SQL tai muut tukevat kyselyt. Esimerkiksi rivi 13 on dm_exec_sql_text, jota kutsutaan yllä olevasta kyselystä, joka tarkistaa suunnitelman.
jos haluamme suodattaa tämän vain kirjoittamiimme kyselyihin, voit tehdä sen lisäämällä missä teksti kuten … – lausekkeen kyselyyn kuten tässä.
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%';
Tässä näemme, että vain kolme kyselyä näkyvät, ja että jokainen näistä kolmesta vie noin 40k muistia SQL Server. joten miksi samasta SELECT-lauseesta on kolme kopiota, tämä tuntuu hieman tuhlailevalta. Itse asiassa se tekee, lisätietoja Katso aikaisempi viesti nimeltään Kuinka paljon menettelyä välimuisti ei yksi SQL selvitys kestää? On olemassa tapoja korjata tämä.
käyttämällä DBCC Freeproccachea tiettyyn Suunnitelmakahvaan
jos halusi tyhjentää vain yhden suunnitelman kahvan, eikä kaikkia suunnitelman kahvoja, saattoi käyttää valinnaista parametria nimeltä @handle.
saadaksemme suunnitelman haltuunsa, aloitamme muokkaamalla aikaisempaa kyselyämme näyttääksemme, mitä suunnitelman välimuistissa on. Voisitte jättää pois oman järjestelmänne WHERE-lausekkeen,mutta minulla on se täällä näyttääkseni meille vain kolme edellä mainittua kysymystä.
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%';
Tässä näemme samat kolme kyselyn suunnitelmia aiemmasta, jossa lisäksi sarake nimeltään plan_handle. Jos haluat vapauttaa yhden suunnitelman kahvan, kopioimme numeerisen suunnitelman kahvan ja lisäämme sen DBCC: n FreeProcCache-kyselyyn.
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%';
missä näemme vain 2 kolmesta alkuperäisestä kyselyt suunnitelman välimuisti.
kuinka suuri on Toimenpidekätköni?
voit suorittaa seuraavan kyselyn tarkistaaksesi toimenpidevälimuistin koon.
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;
, joka tuottaa testipalvelimellani seuraavat tulokset.
tietokannan kuntoraportit ja Plan-välimuistin
voit tarkastella plan-välimuistia myös tietokannan kuntoraportit-sovelluksen avulla kuten tässä.
huomautukset:
lisätietoja on TSQL Wiki DBCC freeproccachessa.
DBCC Komentokuukausi at SteveStedman.com se on melkein yhtä hauskaa kuin hyytelön syöminen.
Steve ja Stedman Solutionsin tiimi ovat täällä kaikkia SQL Server-tarpeitasi varten.
Contct us today for your free 30 minute consultation..
olemme valmiita auttamaan!