Ladění výkonu s ukládáním sady výsledků do mezipaměti

Pokud je povolené ukládání do mezipaměti sady výsledků, vyhrazený fond SQL automaticky ukládá výsledky dotazů do uživatelské databáze pro opakované použití. To umožňuje následným spuštěním dotazů získat výsledky přímo z trvalé mezipaměti, takže není potřeba provádět výpočty. Ukládání sady výsledků do mezipaměti zlepšuje výkon dotazů a snižuje využití výpočetních prostředků. Kromě toho dotazy využívající sadu výsledků v mezipaměti nepoužívají žádné sloty souběžnosti, a proto se nezapočítávají do stávajících limitů souběžnosti. V případě zabezpečení mají uživatelé přístup pouze k výsledkům uloženým v mezipaměti, pokud mají stejná oprávnění k přístupu k datům jako uživatelé vytvářející výsledky v mezipaměti. Ukládání sady výsledků do mezipaměti je ve výchozím nastavení vypnuté na úrovni databáze a relací.

Poznámka:

Ukládání do mezipaměti sady výsledků by se nemělo používat ve spojení s DECRYPTBYKEY. Pokud je potřeba tuto kryptografickou funkci použít, ujistěte se, že je v době spuštění zakázané ukládání sad výsledků do mezipaměti (buď na úrovni relace nebo úrovni databáze).

Klíčové příkazy

Zapnutí/vypnutí ukládání sad výsledků do mezipaměti pro uživatelskou databázi

Zapnutí/vypnutí ukládání výsledků do mezipaměti pro relaci

Kontrola velikosti sady výsledků v mezipaměti

Vyčištění mezipaměti

Co není uložené v mezipaměti

Jakmile je pro databázi zapnuté ukládání sady výsledků do mezipaměti, výsledky se ukládají do mezipaměti pro všechny dotazy, dokud nebude mezipaměť plná, s výjimkou těchto dotazů:

  • Dotazy s předdefinovanými funkcemi nebo výrazy modulu runtime, které nejsou deterministické, i když v datech nebo dotazu základních tabulek nedošlo k žádné změně. Například DateTime.Now(), GetDate().
  • Dotazy využívající uživatelem definované funkce
  • Dotazy využívající tabulky se zabezpečením na úrovni řádků
  • Dotazy vracející data s velikostí řádku větší než 64 kB
  • Dotazy vracející velké objemy dat (>10 GB)

Poznámka:

  • Některé ne deterministické funkce a výrazy modulu runtime mohou být deterministické pro opakované dotazy na stejná data. Například ROW_NUMBER().
  • Pokud je pořadí nebo posloupnost řádků v sadě výsledků dotazu pro logiku vaší aplikace důležitá, použijte v dotazu ORDER BY.
  • Pokud data ve sloupcích ORDER BY nejsou jedinečná, neexistuje žádné zaručené pořadí řádků pro řádky se stejnými hodnotami ve sloupcích ORDER BY bez ohledu na to, jestli je povolené nebo zakázané ukládání sady výsledků do mezipaměti.

Důležité

Operace pro vytvoření mezipaměti sady výsledků a načtení dat z mezipaměti probíhají na řídicím uzlu vyhrazené instance fondu SQL. Pokud je ukládání sady výsledků do mezipaměti zapnuté, můžou spuštěné dotazy, které vracejí velkou sadu výsledků (například >1 GB), způsobit vysoké omezování na řídicím uzlu a zpomalit celkovou odpověď dotazu v instanci. Tyto dotazy se běžně používají při zkoumání dat nebo operacích ETL. Aby se zabránilo stresu řídicího uzlu a problému s výkonem, uživatelé by před spuštěním těchto typů dotazů měli vypnout ukládání sad výsledků do mezipaměti v databázi.

Spusťte tento dotaz po dobu, kterou trvalo operace ukládání výsledků sady výsledků dotazu do mezipaměti:

SELECT step_index, operation_type, location_type, status, total_elapsed_time, command
FROM sys.dm_pdw_request_steps
WHERE request_id  = <'request_id'>;

Tady je příklad výstupu dotazu spuštěného se zakázaným ukládáním sady výsledků do mezipaměti.

Snímek obrazovky s výsledky dotazu, včetně typu umístění a příkazu

Tady je příklad výstupu dotazu spuštěného s povolenou ukládáním sady výsledků do mezipaměti.

Snímek obrazovky s výsledky dotazu s vybraným příkazem * z [D W ResultCache D b] dot d b o vyvolaným

Při použití výsledků uložených v mezipaměti

Sada výsledků v mezipaměti se opakovaně používá pro dotaz, pokud jsou splněny všechny následující požadavky:

  • Uživatel, který dotaz spouští, má přístup ke všem tabulkám odkazovaným v dotazu.
  • Mezi novým dotazem a předchozím dotazem, který vygeneroval mezipaměť sady výsledků, je přesná shoda.
  • V tabulkách, ze kterých byla vygenerována sada výsledků uložených v mezipaměti, nejsou žádná data ani změny schématu.

Spuštěním tohoto příkazu zkontrolujte, zda byl dotaz proveden s úspěchem nebo chybou v mezipaměti výsledků. Sloupec result_cache_hit vrátí hodnotu 1 pro zásah do mezipaměti, 0 pro chybějící zásah do mezipaměti a záporné hodnoty, které udávají důvody, proč se ukládání sady výsledků do mezipaměti nepoužilo. Zkontrolujte sys.dm_pdw_exec_requests pro podrobnosti.

SELECT request_id, command, result_cache_hit FROM sys.dm_pdw_exec_requests
WHERE request_id = <'Your_Query_Request_ID'>

Správa výsledků uložených v mezipaměti

Maximální velikost mezipaměti sady výsledků je 1 TB na databázi. Výsledky uložené v mezipaměti se automaticky zneplatní při změně podkladových dat dotazu.

Odstranění mezipaměti je automaticky řízeno vyhrazeným SQL fondem podle tohoto plánu:

  • Každých 48 hodin, pokud se sada výsledků nepoužila nebo je neplatná.
  • Když se mezipaměť sady výsledků blíží maximální velikosti.

Uživatelé můžou ručně vyprázdnit celou mezipaměť sady výsledků pomocí jedné z těchto možností:

  • Vypněte funkci mezipaměti sady výsledků pro databázi
  • Spusťte DBCC DROPRESULTSETCACHE při připojení k databázi

Pozastavení databáze nevyprázdní sadu výsledků uložených v mezipaměti.

Další kroky

Další tipy pro vývoj najdete v přehledu vývoje.