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

Jak zjistit, co se kompiluje na serveru SQL Server

Když jsem se v minulosti musel zabývat problémy s ukládáním plánu do mezipaměti/nadměrnou rekompilací dotazů, řídil jsem se pokyny uvedenými v dokumentu Microsoft whitepaper 'Plán ukládání do mezipaměti v SQL Server 2008' a důrazně doporučuji přečíst si to, protože pokrývá ukládání plánu do mezipaměti, opětovné použití plánu dotazů, příčiny rekompilací, identifikaci rekompilací a další související témata.

Díky tomu SQL Server Profiler (měl by být umístěn pod Microsoft SQL Server 2008 -> Performance Tools, pokud jste jej nainstalovali jako součást instalace klientských nástrojů) odhaluje tři události přímo související s kompilací dotazů, které vám mohou pomoci:

  • Kurzor
    • CursorRecompile
  • Výkon
    • Showplan XML for Query Compile
  • Uložená procedura
    • SP:Zkompilujte

Používáte uložené procedury, takže se pravděpodobně musíte starat pouze o SP:Zkompilovat událost. Tato událost se spustí pokaždé, když byla překompilována uložená procedura, spouštěč nebo uživatelsky definovaná funkce. Sloupec TextData zobrazí text příkazu tsql, který způsobil rekompilaci příkazu, a sloupec EventSubClass zobrazí kód, který označuje důvod rekompilace.

Kódy EventSubClass pro SP:Recompile in SQL 2008

  • 1 =schéma změněno
  • 2 =Statistika změněna
  • 3 =Překompilovat DNR
  • 4 =Možnost nastavení změněna
  • 5 =Dočasná tabulka změněna
  • 6 =Vzdálená sada řádků změněna
  • 7 =Změna oprávnění k procházení
  • 8 =Prostředí oznámení dotazu změněno
  • 9 =zobrazení MPI změněno
  • 10 =Možnosti kurzoru změněny
  • 11 =S možností opětovné kompilace

Pokud budete sledovat následujících 5 událostí, budete moci vidět, které uložené procedury a příkazy jsou na serveru SQL vyvolány a které spouštějí rekompilace:

  • Procedury obchodu
    • SP:Spouštění
    • SP:StmtStarting
    • SP:Zkompilujte
    • SP:Dokončeno
  • Výkon
    • Automatické statistiky

Obvykle také nastavuji trasování Profiler tak, aby zachytily všechny sloupce pro tyto události. Řekl bych, že nastavte trasování s těmito 5 událostmi, spusťte trasování po dobu 30 až 60 sekund a poté jej pozastavte a pak byste měli mít dobrý přehled o tom, co způsobuje rekompilace.

Pokud je příliš mnoho šumu, můžete začít přidávat filtry sloupců do vlastností trasování a filtrovat události in/out. Pokud například zjistíte, že většina vašich rekompilací probíhá pouze v jedné databázi, nastavte filtr sloupců pro sloupec databaseID nebo databaseName, takže do vašeho trasování budou zahrnuty pouze dotazy spuštěné proti této databázi.

Pak začněte hledat vzory, ve kterých jsou dotazy rekompilovány, a použijte whitepaper od Microsoftu jako vodítko k tomu, proč by mohly spouštět rekompilaci.




  1. Jak deaktivovat spouštěče v MySQL?

  2. Localhost php_network_getaddresses:getaddrinfo se nezdařilo:Žádný takový hostitel není znám

  3. SELECT CASE WHEN THEN (VYBRAT)

  4. Jak předat hodnotu názvu sloupce jako argument SQL pomocí zástupných symbolů