Det finns några sätt att säkerställa omkompilering av en lagrad procedur:
- med
WITH RECOMPILE
, - gör den lagrade proceduren dynamisk (tänk
exec()
) - markera proc för omkompilering med
sp_recompile
. - ändra schemat som en cachad frågeplan bygger på
- ringer
DBCC FREEPROCCACHE
- På frågenivå kan en enskild sats inom en proc kompileras om med frågetipset RECOMPILE (SQL 2008).
Faktorer vid omkompilering
Förutom de svåra faktorerna som anges ovan, vad orsakar omkompilering av lagrad procedur? Tja, massor av saker. Några av dessa är sammanvävda med listan ovan, men jag vill återge dem eftersom det kanske inte är självklart.
- Infoga eller ta bort massor av data (datatäthet i index och tabeller styr ofta frågeplaner)
- Återskapa index (en ändring av underliggande objekt)
- Skapa/släppa tillfälliga tabeller (återigen, underliggande DML-ändringar).
- frågeplanen åldras (tror inte använd nyligen och sql vill rensa upp minnesanvändning)
Detta är inte på något sätt en uttömmande lista. Frågeoptimeraren utvecklas och överraskar oavsett hur länge du har använt SQL Server. Men här är några resurser som kan vara användbara:
- Felsöka omkompilering av lagrad procedur (en gammal, men en godis)
- Återkomplettera lagrade procedurer
- Optimera lagrade SQL Server-procedurer för att undvika omkompileringar
- Cachning och återanvändning av exekveringsplan (ett måste läsas)
MEN VÄNTA - DET FINNS MER!
Med det sagt är antagandet i din fråga att omkompilering alltid är dåligt för prestanda. Faktum är att recompliment ofta är bra.
Så när vill du att den ska kompileras om? Låt oss titta på ett exempel på en proc som söker på efternamn. Lagrade procedurer gör "parametersniffning
' vilket är en välsignelse (om det fungerar för dig) och en förbannelse (om det verkar mot dig). Först passerar någon söker på Zebr%
för zerbrowski. Efternamnsindexet inser att detta är mycket specifikt och kommer att returnera, låt oss säga, 3 rader från en miljon -- så en utförandeplan är byggd. Med processen kompilerad för ett resultat med låg rad, är nästa sökning efter S%
. Tja, S är ditt vanligaste namn och matchar 93 543 rader av 1 miljon.