Freigeben über


Leistungsoptimierung mit Ergebnissatzzwischenspeicherung

Wenn die Zwischenspeicherung des Resultsets aktiviert ist, speichert der dedizierte SQL-Pool Abfrageergebnisse automatisch in der Benutzerdatenbank für eine wiederholte Nutzung. Auf diese Weise können nachfolgende Abfrageausführungen Ergebnisse direkt aus dem permanenten Cache abrufen, sodass keine Neukompilierung erforderlich ist. Die Zwischenspeicherung von Resultset verbessert die Abfrageleistung und reduziert die Computeressourcennutzung. Darüber hinaus verwenden Abfragen, die zwischengespeicherte Resultset verwenden, keine Parallelitätsplätze und zählen daher nicht für vorhandene Parallelitätsgrenzwerte. Aus Sicherheitsgründen können Benutzer nur auf die zwischengespeicherten Ergebnisse zugreifen, wenn sie über dieselben Datenzugriffsberechtigungen verfügen wie die Benutzer, die die zwischengespeicherten Ergebnisse erstellen. Die Zwischenspeicherung des Resultsets ist standardmäßig auf Datenbank- und Sitzungsebene deaktiviert.

Hinweis

Das Zwischenspeichern des Resultsets darf nicht in Verbindung mit DECRYPTBYKEY verwendet werden. Wenn diese kryptografische Funktion erforderlich ist, stellen Sie sicher, dass Sie die Zwischenspeicherung des Resultsets zum Zeitpunkt der Ausführung (entweder auf Sitzungsebene oder Datenbankebene) deaktiviert haben.

Tastenbefehle

Aktivieren/Deaktivieren der Zwischenspeicherung des Resultsets für eine Benutzerdatenbank

Aktivieren/Deaktivieren der Zwischenspeicherung des Resultsets für eine Sitzung

Überprüfen der Größe des zwischengespeicherten Resultsets

Den Cache bereinigen

Was nicht zwischengespeichert wird

Sobald die Zwischenspeicherung des Resultset für eine Datenbank aktiviert ist, werden die Ergebnisse für alle Abfragen zwischengespeichert, bis der Cache voll ist, mit Ausnahme dieser Abfragen:

  • Abfragen mit integrierten Funktionen oder Laufzeitausdrücken, die nicht deterministisch sind, auch wenn keine Änderung der Daten oder Abfrage von Basistabellen auftritt. Beispielsweise DateTime.Now(), GetDate().
  • Abfragen mit benutzerdefinierten Funktionen
  • Abfragen mit Tabellen mit Sicherheit auf Zeilenebene
  • Abfragen, die Daten mit Zeilengröße zurückgeben, die größer als 64 KB sind
  • Abfragen, die große Datenmengen liefern (>10 GB)

Hinweis

  • Einige nicht deterministische Funktionen und Laufzeitausdrücke können für sich wiederholende Abfragen mit denselben Daten deterministisch sein. Beispiel: ROW_NUMBER().
  • Verwenden Sie ORDER BY in Ihrer Abfrage, wenn die Reihenfolge/Reihenfolge von Zeilen im Abfrageergebnissatz für Ihre Anwendungslogik wichtig ist.
  • Wenn Daten in den ORDER BY-Spalten nicht eindeutig sind, gibt es keine garantierte Zeilenreihenfolge für Zeilen mit denselben Werten in den ORDER BY-Spalten, unabhängig davon, ob die Zwischenspeicherung des Ergebnisses aktiviert oder deaktiviert ist.

Von Bedeutung

Vorgänge zum Erstellen des Resultset-Caches und zum Abrufen von Daten aus dem Cache werden auf dem Steuerungsknoten einer dedizierten SQL-Pool-Instanz durchgeführt. Wenn die Zwischenspeicherung von Resultset aktiviert ist, können Abfragen, die ein großes Resultset (z. B. 1 GB) zurückgeben, zu einer hohen Drosselung auf dem Steuerknoten führen und die Gesamtabfrageantwort für die Instanz verlangsamen. Diese Abfragen werden häufig beim Durchsuchen von Daten oder ETL-Vorgängen verwendet. Benutzer sollten das Zwischenspeichern von Resultsets auf der Datenbank deaktivieren, bevor sie diese Abfragetypen ausführen, um den Kontrollknoten nicht zu belasten und Leistungsprobleme zu verursachen.

Führen Sie diese Abfrage für die Zeit aus, die von Resultset-Zwischenspeicherungsvorgängen für eine Abfrage verwendet wird:

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

Nachfolgend sehen Sie eine Beispielausgabe für eine Abfrage, die mit deaktivierter Zwischenspeicherung des Resultsets ausgeführt wird.

Screenshot: Abfrageergebnisse, einschließlich Standorttyp und Befehl.

Hier ist eine Beispielausgabe für eine Abfrage, die mit aktivierter Zwischenspeicherung des Resultsets ausgeführt wird.

Screenshot zeigt Abfrageergebnisse mit dem Befehl 'SELECT * FROM [D W ResultCache Db].dbo' aufgerufen.

Beim Verwenden zwischengespeicherter Ergebnisse

Das zwischengespeicherte Resultset wird für eine Abfrage wiederverwendet, wenn alle folgenden Anforderungen erfüllt sind:

  • Der Benutzer, der die Abfrage ausführt, hat Zugriff auf alle Tabellen, auf die in der Abfrage verwiesen wird.
  • Es gibt eine genaue Übereinstimmung zwischen der neuen Abfrage und der vorherigen Abfrage, die den Ergebnisdatensatz-Cache erzeugt hat.
  • Es gibt keine Daten- oder Schemaänderungen in den Tabellen, aus denen das zwischengespeicherte Resultset generiert wurde.

Führen Sie diesen Befehl aus, um zu überprüfen, ob eine Abfrage mit einem Treffer oder Fehlvorgang im Ergebniscache ausgeführt wurde. Die spalte result_cache_hit gibt 1 für Cachetreffer, 0 für Cachefehler und negative Werte aus Gründen zurück, warum die Zwischenspeicherung des Resultsets nicht verwendet wurde. Prüfen Sie sys.dm_pdw_exec_requests auf Details.

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

Verwalten zwischengespeicherter Ergebnisse

Die maximale Größe des Result-Set-Caches beträgt 1 TB je Datenbank. Die zwischengespeicherten Ergebnisse werden automatisch ungültig, wenn sich die zugrunde liegenden Abfragedaten ändern.

Die Cacheräumung wird von dediziertem SQL-Pool automatisch nach diesem Zeitplan verwaltet:

  • Alle 48 Stunden, wenn das Resultset nicht verwendet oder ungültig wurde.
  • Wenn sich der Resultset-Cache der maximalen Größe nähert.

Benutzer können den gesamten Ergebnismengen-Cache manuell leeren, indem sie eine der folgenden Optionen verwenden:

  • Schalten Sie die Ergebnis-Cache-Funktion der Datenbank aus.
  • Ausführen von DBCC DROPRESULTSETCACHE während der Verbindung mit der Datenbank

Beim Anhalten einer Datenbank werden zwischengespeicherte Ergebnismengen nicht gelöscht.

Nächste Schritte

Weitere Hinweise zur Entwicklung finden Sie in der Entwicklungsübersicht.