Prestaties afstemmen door resultatensets op te slaan in de cache

Wanneer caching van resultatensets is ingeschakeld, slaat een toegewezen SQL-pool automatisch queryresultaten in de gebruikersdatabase op voor herhaald gebruik. Hierdoor kunnen volgende query-uitvoeringen resultaten rechtstreeks ophalen uit de persistente cache, zodat hercomputatie niet nodig is. Caching van resultatensets verbetert de queryprestaties en vermindert het gebruik van rekenresources. Bovendien maken query's die gebruikmaken van in de cache opgeslagen resultatenset geen gebruik van gelijktijdigheidssleuven en tellen ze dus niet mee voor bestaande gelijktijdigheidslimieten. Om veiligheidsredenen hebben gebruikers alleen toegang tot de resultaten in de cache als ze dezelfde machtigingen voor gegevenstoegang hebben als de gebruikers die de resultaten in de cache maken. Caching van resultatensets is standaard UITGESCHAKELD op database- en sessieniveau.

Notitie

Caching van resultatensets mag niet worden gebruikt in combinatie met DECRYPTBYKEY. Als deze cryptografische functie moet worden gebruikt, moet u ervoor zorgen dat de caching van de resultatenset is uitgeschakeld (op sessie- of databaseniveau) op het moment van uitvoering.

Sleutelopdrachten

Caching van resultatensets in-/uitschakelen voor een gebruikersdatabase

Caching van resultatensets in-/uitschakelen voor een sessie

De grootte van de resultatenset in de cache controleren

De cache opschonen

Wat niet in de cache is opgeslagen

Zodra caching van resultatensets is ingeschakeld voor een database, worden de resultaten voor alle query's in de cache opgeslagen totdat de cache vol is, met uitzondering van deze query's:

  • Query's met ingebouwde functies of runtime-expressies die niet-deterministisch zijn, zelfs wanneer er geen wijzigingen zijn in de gegevens of query van basistabellen. Bijvoorbeeld DateTime.Now(), GetDate().
  • Query's met door de gebruiker gedefinieerde functies
  • Query's met behulp van tabellen met beveiliging op rijniveau
  • Query's die gegevens retourneren met een rijgrootte groter dan 64 kB
  • Query's die grote gegevens retourneren (>10 GB)

Notitie

  • Sommige niet-deterministische functies en runtime-expressies kunnen deterministisch zijn voor terugkerende query's op dezelfde gegevens. Bijvoorbeeld ROW_NUMBER().
  • Gebruik ORDER BY in uw query als de volgorde/volgorde van rijen in de queryresultatenset belangrijk is voor uw toepassingslogica.
  • Als de gegevens in de ORDER BY-kolommen niet uniek zijn, is er geen gegarandeerde rijvolgorde voor rijen met dezelfde waarden in de kolommen ORDER BY, ongeacht of caching van resultatensets is ingeschakeld of uitgeschakeld.

Belangrijk

De bewerkingen voor het maken van de resultatensetcache en het ophalen van gegevens uit de cache vinden plaats op het beheerknooppunt van een toegewezen SQL-poolexemplaar. Wanneer caching van resultatensets is ingeschakeld, kunnen query's die een grote resultatenset retourneren (bijvoorbeeld >1 GB) een hoge beperking op het besturingsknooppunt veroorzaken en de algehele queryreactie op het exemplaar vertragen. Deze query's worden vaak gebruikt tijdens gegevensverkenning of ETL-bewerkingen. Om stress op het besturingsknooppunt te voorkomen en prestatieproblemen te veroorzaken, moeten gebruikers het opslaan van resultatensets in de database uitschakelen voordat ze deze typen query's uitvoeren.

Voer deze query uit voor de tijd die nodig is voor het opslaan van cachebewerkingen voor een query in de resultatenset:

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

Hier volgt een voorbeeld van uitvoer voor een query die is uitgevoerd met caching van resultatensets uitgeschakeld.

Schermopname van queryresultaten, inclusief locatietype en opdracht.

Hier volgt een voorbeeld van uitvoer voor een query die is uitgevoerd met caching van resultatensets ingeschakeld.

Schermopname van queryresultaten met de opdracht * geselecteerd in [D W ResultCache D b] punt d b o uitgelicht.

Wanneer resultaten in de cache worden gebruikt

De resultatenset in de cache wordt opnieuw gebruikt voor een query als aan alle volgende vereisten wordt voldaan:

  • De gebruiker die de query uitvoert, heeft toegang tot alle tabellen waarnaar in de query wordt verwezen.
  • Er is een exacte overeenkomst tussen de nieuwe query en de vorige query die de cache van de resultatenset heeft gegenereerd.
  • Er zijn geen gegevens of schemawijzigingen in de tabellen waaruit de resultatenset in de cache is gegenereerd.

Voer deze opdracht uit om te controleren of een query is uitgevoerd met een resultaatcachetreffer of -misser. De kolom result_cache_hit retourneert 1 voor cachetreffer, 0 voor cachemissing en negatieve waarden om redenen waarom caching van resultatensets niet is gebruikt. Raadpleeg sys.dm_pdw_exec_requests voor meer informatie.

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

Resultaten in cache beheren

De maximale grootte van de resultatensetcache is 1 TB per database. De resultaten in de cache worden automatisch ongeldig gemaakt wanneer de onderliggende querygegevens worden gewijzigd.

De cacheverwijdering wordt automatisch beheerd door een toegewezen SQL-pool volgens dit schema:

  • Elke 48 uur als de resultatenset niet is gebruikt of ongeldig is gemaakt.
  • Wanneer de cache van de resultatenset de maximale grootte nadert.

Gebruikers kunnen de volledige cache van de resultatenset handmatig leegmaken met behulp van een van deze opties:

  • De cachefunctie voor de resultatenset uitschakelen voor de database
  • DBCC DROPRESULTSETCACHE uitvoeren terwijl u verbinding hebt met de database

Als u een database onderbroken, wordt de resultatenset in de cache niet leeggemaakt.

Volgende stappen

Zie Overzicht van ontwikkeling voor meer tips voor ontwikkeling.