sql >> Databáze >  >> RDS >> Sqlserver

Jaké faktory mohou způsobit rekompilaci uložené procedury na serveru SQL Server?

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é:

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.



  1. Jak získat hodnotu SQL_CALC_FOUND_ROWS pomocí připravených příkazů?

  2. vyberte souřadnice u jiných tabulek

  3. MySQL Event If Příkaz END IF Error

  4. Jak zrušit všechna výchozí omezení v databázi SQL Server - SQL Server / TSQL výukový program, část 94