recompile Hints and Execution Plan Caching
az XKCD klasszikus DBA verziója.
ha azonosítja, hogy a paraméter szippantás probléma, meg kell vizsgálnia, hogy a “recompile” tippek végrehajtása segít-e a minőség megtervezésében. (Nem biztos benne, hogy mi a paraméter szippantás? Ismerje meg ezt a blogbejegyzést vagy ezt a 30 perces ingyenes videót.) El kell döntenie: milyen célzást vagy parancsot használ, és hová teszi? Milyen kompromisszumokat hoz létre, amikor az SQL Server teljesítményét a jövőben képes hangolni?
Ez a bejegyzés fut a közös lehetőségek van, hogy lökést (vagy ütés) SQL Server generáló friss végrehajtási tervet. Adok néhány előnye és hátránya minden módszer, és elmagyarázza, mi hasznos, és mit érdemes elkerülni.
ahhoz, hogy a dolgok viszonylag egyszerűek legyenek, csak arról beszélek, hogy ez hogyan vonatkozik a tárolt eljárásokra ma–ez a bejegyzés nem terjed ki a paraméterezett (vagy nem paraméterezett) lekérdezések más formáira. Ha nagy kérdései vannak ezeken a területeken, nyugodtan javasolhatja azt egy jövőbeli hozzászóláshoz a megjegyzésekben.
jogi nyilatkozat: Az Újrakomponált tippek megölhetik a teljesítményt azáltal, hogy helytelenül használják a CPU-kat. Óvatosan kezelje!
Hasznos Dinamikus Vezetés Nézetek
Ha arról beszélek, hatással van a végrehajtási terv, cache, akkor lásd, hogy két DMVs:
- sys.dm_exec_query_stats – Ez a DMV hasznos, hogy a felső nyilatkozatok az SQL Server, függetlenül attól, hogy egy eljárás, vagy nem. Nézze meg a minta lekérdezés itt.
- sys.dm_exec_procedure_stats – ez a DMV csak az SQL Server 2008 vagy újabb verziójában érhető el. Nyomon követi a tárolt eljárások végrehajtási mutatóit. Nézze meg a minta lekérdezés könyvek Online.
mindkét DMV esetében, ha a gyorsítótárban van egy végrehajtási terv, az a végrehajtási mutatók látásához kapcsolódik: az összes kivégzés száma, a teljes és az átlagos CPU, a logikai olvasás stb. Ha egy végrehajtási tervet eltávolítanak a gyorsítótárból az újrakompilálás, a memória nyomása, az újraindítás vagy más műveletek miatt, akkor a kapcsolódó végrehajtási mutatókat is eltávolítják.
futásidejű recompile hint
az egyik lehetőség, hogy szeretem a gyors és egyszerű tesztelés az a képesség, hogy hívja a tárolt eljárás egy recompile hint a végrehajtási idő. Ez nagyszerű, mert nem kell megváltoztatnia az összeállított kódot. A tipp is csak vonatkozik, hogy mit csinálsz futásidőben.
ehhez csak a szintaxist használja:
1
2
|
EXEC dbo.Proc3 @parameter1=80 WITH RECOMPILE;
GO
|
However, there’s a little bit of a gotcha. If you have nested stored procedures, the recompile hint only applies to code in the outermost procedure. Még mindig kap paraméter szippantás minden hívás al-eljárások belül a tárolt eljárás maga.
tehát bár néha szeretem ezt a tesztet, ha bármilyen fészkelés van a tárolt eljárásokban, előfordulhat, hogy nem segít egy igazán friss végrehajtási terv elkészítésében.
A Sp_recompile rendszer tárolt eljárásának használata
Ez néha hasznos lehet, ha be kell avatkoznia egy termelési esemény során, ha rossz tervet használ a bejövő munkamenetek ismételten. You can force recompilation of plans by running sp_recompile against an object– most common choices are a table or a stored procedure. The command looks like this (a table in this example):
1
2
|
EXEC sp_recompile ‘Person.Address’;
GO
|
Ha ez fut, a kapcsolódó tervek nem kerülnek azonnal eltávolításra az SQL Server végrehajtási terv gyorsítótárából. Ehelyett a varázslat történik a következő alkalommal lekérdezések hivatkozva az újrakomponált objektum fut. Ezen a ponton a sys.dm_exec_query_stats meglévő végrehajtási statisztikái visszaállnak a tervben szereplő kijelentésekre.
végrehajtás számít sys.dm_exec_procedure_stats nem feltétlenül kell visszaállítani a következő használat, ha megjelöli a táblázatot által használt tárolt eljárás újrakompilálás. De ha maga a tárolt eljárást jelöli az újrakompiláláshoz, akkor a következő használat során visszaáll. (Ne zavarja, hogy megpróbálja megjegyezni ezt, csak olvassa el a következő bekezdést.)
ennek nagy hátrányai vannak. Ez a parancs nagy engedélyt igényel — az azt futtató felhasználó “alter” engedélyeket igényel az asztalon. Azt is megköveteli a magas szintű zár befejezni. Elfoglalt rendszereken láttam, hogy ez a parancs részt vesz néhány csúnya blokkoló láncban. Légy óvatos vele!
bár ez időnként hasznos lehet hibaelhárításhoz és teszteléshez, ne tegye a gyártási kód részévé.
recompile tippeket tárolt eljárás fejlécek
Ha már megvan eljárásokat, hogy szeretne létrehozni friss tervek, elkezdi megnézni, hogyan kell használni tippeket az eljárás. Az a lehetőség, amelyet a legtöbb ember először fedez fel, az, hogy a tárolt eljárás fejlécében “újrafordítással” használja, mint ez:
1
2
3
4
5
6
7
8
9
10
|
ALTER PROCEDURE dbo.Proc3
@parameter1 int
WITH RECOMPILE
AS
SELECT DISTINCT City as CityFromProc3
FROM Person.Cím
ahol StateProvinceID = @parameter1;
EXEC dbo.Proc2 @parameter1;
GO
|
recompile használata a tárolt eljárás fejlécében elég drasztikus — az eljárás nem gyorsítótárazza a végrehajtási tervet, amikor fut. Ez azt jelenti:
- nincs végrehajtási terv a gyorsítótárban a
- nincs sys.dm_exec_query_stats
- nincs sys.dm_exec_procedure_stats
WoW-ban rögzített végrehajtási statisztika.dm_exec_procedure_stats
Wow, ez egy bummer. Ha be kell azonosítania, hogy milyen hatással van ez az eljárás a szerverére, akkor valamilyen nyomkövetést vagy kiterjesztett esemény munkamenetet kell futtatnia, majd betakarítania és értelmeznie kell az eredményeket. Ez nem gyors, és a futó nyomok hatással lehetnek a teljesítményre.
egy nagy negatív. Ezért egyáltalán nem szeretem ezt a választást.
recompile tippeket egyéni nyilatkozatok
Ez az opció egy kicsit több munkát, de van egy sokkal jobb végeredmény idővel. With this option you take the RECOMPILE hint and apply it only to statements in the stored procedure where you’d like to implement the recompile, like this:
1
2
3
4
5
6
7
8
9
|
ALTER PROCEDURE dbo.Proc3
@parameter1 int
AS
válasszon különálló várost CityFromProc3
személytől.Cím
ahol StateProvinceID = @parameter1 opció (RECOMPILE);
EXEC dbo.Proc2 @parameter1;
GO
|
akkor is, ha a tippet az eljárás összes állítására kell használni, nem pedig a fejlécben, ennek továbbra is előnyei vannak! Azáltal, hogy a recompile tipp a nyilatkozat szintjén a proc, akkor varázslatosan kap:
- Korlátozott kiviteli tervek a cache felülvizsgálat (utolsó kivégzés)
- Korlátozott végrehajtás statisztika rögzített sys.dm_exec_query_stats. Csak statisztika az utolsó kivégzést, de a plan_generation_num oszlop lesz növekedés, legalább ad betekintést, hogy valami van.
- Sys.dm_exec_procedure_stats
Az a tény, hogy bizonyos információkat kap ezekben a DMV-kben, szuper hasznos lehet az idő múlásával. Alkalmazása recompile tippeket csak a nyilatkozatokat, hogy szükség van rájuk is csak több felelős-ez csökkenti annak kockázatát, égő magát idővel CPU éget.
DBCC FREEPROCCACHE-the nuclear option
Ez nem szigorúan egy recompile tipp – de biztosan nem okoz recompilation. Az SQL Servernek van egy parancsa, amellyel elmondhatja: “indítsa újra a friss végrehajtási terveket”. Általában így használják:
1
2
3
|
–This is the nuclear option
DBCC FREEPROCCACHE
GO
|
This command makes everything start fresh– for every query:
- a CPU használat léphet fel, mint új tervek összeállítása
- Kivégzés statisztika törlődik a sys.dm_exec_query_stats (azonnal)
- Kivégzés statisztika törlődik a sys.dm_exec_procedure_stats (azonnal)
Ez a parancs nem gonosz– egy időben egy helyen, a problémamegoldás használata segíthet a kiváltó oka a teljesítmény probléma gyorsan. Mivel azonban hatással van az egész gyorsítótárra, és hatással lehet a teljesítményre is, nagyon óvatosnak kell lennie a használatával. Nem ajánlom ezt a parancsot rendszeres munkákban, automatizált folyamatokban vagy gyártási kódban.
Az SQL Server 2008-tól ezt a parancsot egy kicsit finoman használhatja-eltávolíthat egy adott tervet a gyorsítótárból a “tervfogantyú” vagy az “sql fogantyú” segítségével– de természetesen kitalálnia kell, hogy mi ez a fogantyú, és miért akarja eltávolítani. Ez hasznos lehet bizonyos niche helyzetekben, de a gyakorlatban nem sokat jelent. Azt is törölje a forrás kormányzó medence, de, nos, akkor kell használni erőforrás kormányzó.
mit jelent mindez?
teszteléskor van egy hely az eszköztárban mind az “EXEC procedure WITH RECOMPILE”, mind a sp_recompile procedúra esetében. Óvatosan használja őket, és vigyázzon a lehetséges következményekre, különösen a sp_recompile esetén.
Ha a végrehajtási tippek a kódot, nem kell ÚJRAFORDÍTANI szemellenző– használhatja ‘OPTIMALIZÁLJA A tanácsok néha sikerrel is (bár néha optimalizálása a középszerű). Időnként a dinamikus sql is segíthet.
de ha ÚJRAFORDÍTÓ tippeket használ, kérjük, tartsa az újrakomponálásokat a nyilatkozat szintjén-nem pedig az eljárások fejlécében.
Ha többet szeretne megtudni, nézze meg a Paraméterszippantás osztály alapjait.