sql >> Databasteknik >  >> RDS >> Sqlserver

Vilka faktorer kan orsaka omkompilering av lagrad procedur på SQL Server?

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:

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.



  1. postgres:Vad gör frågan "välj * från användare" egentligen?

  2. Android-setPeriodic för JobScheduler fungerar inte

  3. Returvärde för Oracle.DataAccess kör icke-fråga (lagrad proc)

  4. Hur tar man Count (*) som variabel från SQL till php?