Existuje několik způsobů, jak zajistit rekompilaci uložené procedury:
- pomocí
WITH RECOMPILE
, - učinit uloženou proceduru dynamickou (například
exec()
) - označení procesu pro rekompilaci pomocí
sp_recompile
. - změna schématu, na kterém závisí plán dotazů uložený v mezipaměti
- volání
DBCC FREEPROCCACHE
- Na úrovni dotazu lze jednotlivý příkaz v rámci procesu znovu zkompilovat pomocí nápovědy RECOMPILE pro dotaz (SQL 2008).
Faktory rekompilace
Co kromě výše uvedených tvrdých faktorů způsobuje rekompilaci uložené procedury? No, spousta věcí. Některé z nich jsou propojeny s výše uvedeným seznamem, ale chci je znovu představit, protože to nemusí být zřejmé.
- Vkládání nebo mazání velkého množství dat (hustota dat v indexech a tabulkách často řídí plány dotazů)
- Obnovení indexů (změna podkladových objektů)
- Vytváření/rušení dočasných tabulek (opět základní změny DML).
- plán dotazů stárne (předpokládejme, že se v poslední době nepoužíval a sql chce vyčistit paměť)
Toto není v žádném případě vyčerpávající seznam. Optimalizátor dotazů se vyvíjí a překvapuje bez ohledu na to, jak dlouho používáte SQL Server. Zde jsou ale některé zdroje, které mohou být užitečné:
- Odstraňování problémů s rekompilací uložené procedury (starý, ale fajnový)
- Překompilování uložených procedur
- Optimalizace uložených procedur SQL Server, aby se zabránilo rekompilaci
- Ukládání a opětovné použití plánu provádění (nutno přečíst)
ALE ČEKEJTE – JE TO VÍCE!
Ve vaší otázce se tedy předpokládá, že rekompilace jsou vždy špatné pro výkon. Ve skutečnosti je často kompenzace dobrá.
Kdy byste jej tedy chtěli znovu zkompilovat? Podívejme se na jeden příklad proc, který vyhledává podle příjmení. Uložené procedury provádějí 'sniffování parametrů
“ což je požehnání (pokud to funguje pro vás) a prokletí (pokud to funguje proti vám). Nejprve někdo hledá na Zebr%
pro zerbrowski. Index příjmení si uvědomuje, že je to velmi specifické a vrátí, řekněme, 3 řádky z milionu -- takže je vytvořen jeden plán provádění. S proc zkompilovaným pro výsledek s nízkým řádkem je další hledání S%
. S je vaše nejběžnější jméno a odpovídá 93 543 řádkům z 1 milionu.