PŘEKOMPILOVAT Rady a Plnění Plánu ukládání do Mezipaměti
DBA verze XKCD classic.
Když zjistíte, že parametr šňupání je problém, budete muset vyzkoušet, zda prováděcí ‚překompilovat‘ rad pomůže plán kvality. (Nejste si jisti, jaký parametr čichání je? Učte se z tohoto blogu nebo z tohoto 30 minutové video zdarma.) Musíte se rozhodnout: jakou nápovědu nebo příkaz používáte a kam ji dáte? Jaké kompromisy děláte, pokud jde o schopnost vyladit váš SQL Server v budoucnu?
tento příspěvek prochází běžnými možnostmi, které musíte posunout (nebo udeřit) SQL Server do generování nového plánu provádění. Dám nějaké výhody a nevýhody pro každou metodu a vysvětlím, co je užitečné a co stojí za to se vyhnout.
udržet relativně jednoduché věci, já jsem jen diskutovat o tom, jak to platí pro uložené procedury dnes–tento příspěvek nepokrývá jiné formy parametrizované (nebo non parametrické) dotazy. Pokud máte v těchto oblastech velké otázky, neváhejte to navrhnout pro budoucí příspěvek v komentářích.
Disclaimer: Recompile rady může zabít svůj výkon tím, že zapálí vaše procesory v ohni při nesprávném použití. Zacházejte opatrně!
Užitečné Dynamickou Správu Zobrazení
Když mluvím o dopad na plnění plánu mezipaměti, budu odkazovat na dva DMVs:
- sys.dm_exec_query_stats – DMV je užitečné vidět horní prohlášení na vašem serveru SQL Server, bez ohledu na to, zda jsou součástí postupu, nebo ne. Podívejte se na ukázkový dotaz zde.
- sys.dm_exec_procedure_stats – tento DMV je k dispozici pouze v SQL Server 2008 a vyšší. Sleduje metriky provádění uložených procedur. Podívejte se na ukázkový dotaz v knihách Online.
Pro oba tyto DMVs, že provedení plánu v mezipaměti je spojena se budou moci vidět provedení metriky: celkový počet poprav, celkové a průměrné CPU, logické čtení, atd. Když je plán provádění odstraněn z mezipaměti kvůli rekompilaci, tlaku paměti, restartu nebo jiným akcím, odstraní se také související metriky provádění.
Provedení postupu s runtime překompilovat náznak
Jednou z možností, které mám rád pro rychlé a snadné testování je možnost k volání uložené procedury s překompilovat náznak v době provádění. To je skvělé, protože nemusíte měnit Žádný kompilovaný kód. Váš tip se vztahuje pouze na to,co děláte za běhu.
Chcete-li to provést, stačí použít syntaxi, jako je tato:
1
2
|
EXEC dbo.Proc3 @parameter1=80 WITH RECOMPILE;
GO
|
However, there’s a little bit of a gotcha. If you have nested stored procedures, the recompile hint only applies to code in the outermost procedure. Stále můžete získat čichání parametrů při všech voláních do dílčích procedur v rámci samotné uložené procedury.
takže i když se mi to někdy líbí pro testování, pokud máte v uložených procedurách nějaké vnoření, nemusí vám to pomoci získat skutečně nový plán provádění.
použití procedury uložené v systému sp_recompile
To se někdy hodí, pokud potřebujete zasáhnout během produkčního incidentu, pokud máte špatný plán opakovaně používaný příchozími relacemi. You can force recompilation of plans by running sp_recompile against an object– most common choices are a table or a stored procedure. The command looks like this (a table in this example):
1
2
|
EXEC sp_recompile ‚Person.Address‘;
GO
|
při spuštění nejsou související plány okamžitě odstraněny z mezipaměti plánu provádění SQL Serveru. Místo toho se kouzlo stane při příštím spuštění dotazů odkazujících na překompilovaný objekt. V tomto okamžiku budou existující statistiky provádění v sys. dm_exec_query_stats resetovány pro příkazy v plánu.
Realizace se počítá v sys.dm_exec_procedure_stats nemusí být nutně obnovit na další použití, pokud označíte tabulku používá uložené procedury pro recompilation. Pokud však označíte samotný uložený postup pro rekompilaci, bude při příštím použití resetován. (Neobtěžujte se to zapamatovat, přečtěte si další odstavec.)
má to velké stinné stránky. Tento příkaz vyžaduje vysoké oprávnění-uživatel, který jej provozuje, vyžaduje oprávnění „změnit“ v tabulce. To také vyžaduje vysokou úroveň zámku dokončit. Na rušných systémech jsem viděl, jak se tento příkaz účastní některých ošklivých blokovacích řetězců. Buďte opatrní s ním!
i když to může být občas užitečné pro řešení problémů a testování, nedělejte to součástí výrobního kódu.
překompilujte rady v uložených hlavičkách procedur
Když máte postupy, které chcete generovat nové plány, začnete se dívat na to, jak používat rady v rámci procedury. Možnost většina lidí objevovat první je použití ‚S PŘEKOMPILOVAT‘ v záhlaví uložené procedury, jako je tento:
1
2
3
4
5
6
7
8
9
10
|
ALTER PROCEDURE dbo.Proc3
@parameter1 int
WITH RECOMPILE
AS
SELECT DISTINCT City as CityFromProc3
FROM Person.Adresa
kde StateProvinceID=@parameter1;
EXEC dbo.Proc2 @parametr1;
|
Použitím PŘEKOMPILOVAT v uložené proceduře záhlaví je docela drastické — postup nebude mezipaměť plán provádění, když to běží. To znamená:
- Žádné plnění plánů v mezipaměti recenze
- Ne provedení statistiky zaznamenané v sys.dm_exec_query_stats
- Ne provedení statistiky zaznamenané v sys.dm_exec_procedure_stats
Wow, to je průšvih. Pokud potřebujete zjistit dopad, který má tento postup na váš server, musíte spustit nějakou relaci trasování nebo rozšířených událostí a sklízet a interpretovat výsledky. To není rychlé a běžící stopy mohou ovlivnit výkon.
tak trochu velký negativ. Z tohoto důvodu se mi tato volba vůbec nelíbí.
překompilovat Rady na jednotlivé příkazy
tato volba je trochu více práce, ale má mnohem lepší návratnost v průběhu času. With this option you take the RECOMPILE hint and apply it only to statements in the stored procedure where you’d like to implement the recompile, like this:
1
2
3
4
5
6
7
8
9
|
ALTER PROCEDURE dbo.Proc3
@parameter1 int
AS
vyberte odlišné město jako CityFromProc3
od osoby.Adresa
kde StateProvinceID=@parameter1 volba (překompilovat);
EXEC dbo.Proc2 @parametr1;
|
I když budete muset použít nápovědu na všechny příkazy v postupu, nikoli v záhlaví, to má stále výhody! Tím, že rekompilujete nápovědu na úroveň prohlášení v proc, magicky získáte:
- Omezené provádění plánů v mezipaměti recenze (poslední provedení)
- Omezený provedení statistiky zaznamenané v sys.dm_exec_query_stats. Budete jen získat statistiky pro poslední poprava, ale plan_generation_num sloupec se bude zvyšovat, alespoň že vám vhled, že se něco děje.
- Provedení statistiky zaznamenané v sys.dm_exec_procedure_stats
skutečnost, že některé informace v těchto DMVs může být velmi užitečné v průběhu času. Použití rekompilovat rady pouze na příkazy, které je potřebují, je také jen zodpovědnější-to snižuje riziko spálení se v průběhu času s CPU burn.
DBCC FREEPROCCACHE-jaderná volba
Toto není striktně rekompilovaná nápověda – ale určitě způsobuje rekompilaci. SQL Server má příkaz můžete použít k říct, „Začít znovu s čerstvým provádění plánů“. Obvykle se používá takto:
1
2
3
|
–This is the nuclear option
DBCC FREEPROCCACHE
GO
|
This command makes everything start fresh– for every query:
- využití CPU může jít nahoru jako nové plány jsou sestaveny
- Provedení statistiky jsou vymazány v sys.dm_exec_query_stats (ihned)
- Provedení statistiky jsou vymazány v sys.dm_exec_procedure_stats (ihned)
Tento příkaz není zlé– tam je čas a místo v řešení potíží při použití to může pomoci vám dostat se k příčině problému výkonu rychle. Protože však ovlivňuje celou mezipaměť a může také ovlivnit výkon, musíte ji používat velmi opatrně. Nedoporučuji používat tento příkaz v běžných úlohách, automatizovaných procesech nebo výrobním kódu.
Jako SQL Serveru 2008, tento příkaz můžete použít trochu více jemně– můžete odstranit konkrétní plán z mezipaměti při použití tlačítek „plán zpracování“ nebo „sql zvládnout“– ale samozřejmě musíš zjistit, co to zvládnout, je a proč chcete odstranit. To by mohlo být užitečné v některých specializovaných situacích,ale v praxi to moc nepřijde. Můžete také vymazat fond guvernérů zdrojů, ale museli byste používat guvernéra zdrojů.
co to všechno znamená?
Když jste testování, je tam místo ve vašem toolkit pro oba ‚EXEC postup S PŘEKOMPILOVAT a sp_recompile postup. Používejte je opatrně a dejte si pozor na možné následky, zejména u sp_recompile.
Když jste se provádí rady v kódu, nemusíte PŘEKOMPILOVAT klapky na očích– můžete použít ‚OPTIMALIZOVAT PRO rady, někdy úspěšně (i když někdy je to optimalizace pro průměrný). A občas vám může pomoci i dynamický sql.
ale pokud používáte rekompilovat rady, prosím, aby vaše recompiles na úrovni prohlášení-a ne v záhlaví vašich postupů.
Chcete-li se dozvědět více, podívejte se na naše základy třídy Sniffing parametrů.