Sdílet prostřednictvím


Ladění výkonu s využitím ukládání sad výsledků do mezipaměti

Pokud je povolené ukládání sady výsledků do mezipaměti, 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 přepočítejte. Ukládání do mezipaměti sady výsledků zlepšuje výkon dotazů a snižuje využití výpočetních prostředků. Dotazy používající sadu výsledků v mezipaměti navíc nepoužívají žádné sloty souběžnosti, a proto se nezapočítávají do stávajících limitů souběžnosti. Z důvodu zabezpečení mají uživatelé přístup k výsledkům uloženým v mezipaměti pouze v případě, že mají stejná oprávnění k přístupu k datům jako uživatelé vytvářející výsledky uložené v mezipaměti. Ukládání do mezipaměti sady výsledků je ve výchozím nastavení vypnuté na úrovni databáze a relace.

Poznámka

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

Klávesové příkazy

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

Zapnutí/vypnutí ukládání sady 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

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

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

Poznámka

  • Některé ne deterministické funkce a výrazy modulu runtime můžou být deterministické pro opakující se dotazy na stejná data. Například ROW_NUMBER().
  • Pokud je pořadí nebo posloupnost řádků v sadě výsledků dotazu důležité pro logiku aplikace, 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 ukládání sady výsledků do mezipaměti povolené nebo zakázané.

Důležité

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

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

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 pro dotaz spuštěný 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 pro dotaz spuštěný s povoleným 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] tečka d b o volaný.

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

Sada výsledků v mezipaměti se znovu použije 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, na které dotaz odkazuje.
  • 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 sada výsledků v mezipaměti vygenerována, nejsou žádné změny dat ani schématu.

Spuštěním tohoto příkazu zkontrolujte, jestli se dotaz spustil s chybou nebo chybou v mezipaměti výsledků. Sloupec result_cache_hit vrátí hodnotu 1 pro přístup k mezipaměti, 0 pro chybějící mezipaměť a záporné hodnoty z důvodů, proč se nepoužilo ukládání do mezipaměti sady výsledků. Podrobnosti najdete v sys.dm_pdw_exec_requests .

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í, když se změní podkladová data dotazu.

Vyřazení mezipaměti se automaticky spravuje pomocí vyhrazeného fondu SQL podle tohoto plánu:

  • Každých 48 hodin, pokud se sada výsledků nepoužila nebo byla zneplatněna.
  • 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í:

  • Vypnutí funkce mezipaměti sady výsledků pro databázi
  • Spuštění příkazu DBCC DROPRESULTSETCACHE při připojení k databázi

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

Další kroky

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