SQL Server går i princip igenom dessa steg för att exekvera någon fråga (anrop av lagrad procedur eller ad-hoc SQL-sats):
1) syntaktisk kontrollera frågan
2) om den är okej - den kontrollerar planens cache för att se om den redan har en exekveringsplan för den frågan
3) om det finns en exekveringsplan - den planen är ( åter)används och frågan exekveras
4) om det inte finns någon plan ännu, bestäms en utförandeplan
5) den planen lagras i planens cache för senare återanvändning
6) frågan exekveras
Poängen är:ad-hoc SQL och lagrade procedurer är inte annorlunda .
Om en ad-hoc SQL-fråga använder parametrar på rätt sätt - som den ska i alla fall, för att förhindra SQL-injektionsattacker - är dess prestandaegenskaper inte annorlunda och definitivt inte sämre än att köra en lagrad procedur.
Lagrad procedur har andra fördelar (du behöver inte ge användare direkt tabellåtkomst, till exempel), men när det gäller prestanda är det lika effektivt att använda korrekt parametriserade ad-hoc SQL-frågor. som använder lagrade procedurer.
Uppdatering: använder lagrade procedurer över icke-parametriserade frågor är bättre av två huvudsakliga skäl:
-
eftersom varje icke-parametriserad fråga är en ny, annorlunda fråga till SQL Server måste den gå igenom alla steg för att bestämma exekveringsplanen, för varje fråga (och därmed slösa tid - och även slösa bort plancacheutrymme, eftersom att lagra exekveringsplanen i planens cache inte riktigt hjälper i slutändan , eftersom den specifika frågan förmodligen inte exekveras igen)
-
icke-parametriserade frågor löper risk för SQL-injektionsattack och bör till varje pris undvikas