Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
In diesem Artikel wird die Verwaltung der SQL Server-Abfragespeicher und der umgebenden Features beschrieben.
- Weitere Informationen zum Konfigurieren und Verwalten mit dem Abfragespeicher finden Sie unter Überwachen der Leistung mit dem Abfragespeicher.
Hinweis
In SQL Server 2022 (16.x) ist Abfragespeicher jetzt für alle neu erstellten SQL Server-Datenbanken standardmäßig aktiviert, um den Leistungsverlauf zu verbessern, abfrageplanbezogene Probleme zu beheben und neue Abfrageprozessorfunktionen zu aktivieren.
Standardwerte für den Abfragespeicher in Azure SQL-Datenbank
Dieser Abschnitt beschreibt die optimalen Standardwerte der Konfiguration in Azure SQL-Datenbank, mit denen der zuverlässige Betrieb des Abfragespeichers und der abhängigen Features sichergestellt wird. Die Standardkonfiguration ist für die fortlaufende Datensammlung optimiert. Dies bedeutet, dass möglichst wenig Zeit im Status OFF bzw. READ_ONLY verbracht wird. Weitere Informationen zu allen verfügbaren Abfragespeicher Optionen finden Sie unter ALTER DATABASE SET "Optionen" (Transact-SQL).
| Konfiguration | Beschreibung | Standard | Kommentar |
|---|---|---|---|
| MAX_STORAGE_SIZE_MB | Gibt das Limit für den Datenspeicherplatz an, den der Abfragespeicher in der Kundendatenbank belegt. | 100 vor SQL Server 2019 (15.x) 1000 ab SQL Server 2019 (15.x) |
Für neue Datenbanken verbindlich |
| INTERVAL_LENGTH_MINUTES | Definiert die Größe des Zeitfensters, in dem gesammelte Laufzeitstatistiken für Abfragepläne aggregiert und dauerhaft gespeichert werden. Jeder aktive Abfrageplan verfügt über maximal eine Zeile für einen mit dieser Konfiguration definierten Zeitraum. | 60 | Für neue Datenbanken verbindlich |
| STALE_QUERY_THRESHOLD_DAYS | Zeitbasierte Bereinigungsrichtlinie, mit der der Aufbewahrungszeitraum für dauerhaft gespeicherte Laufzeitstatistiken und inaktive Abfragen gesteuert wird. | 30 | Für neue Datenbanken und Datenbanken mit vorheriger Standardeinstellung erzwungen (367) |
| SIZE_BASED_CLEANUP_MODE | Gibt an, ob die automatische Datenbereinigung durchgeführt wird, wenn der Datenumfang des Abfragespeichers sich dem Grenzwert nähert. | Auto | Für alle Datenbanken erzwungen |
| QUERY_CAPTURE_MODE | Gibt an, ob die Gesamtmenge aller Abfragen oder nur eine Teilmenge der Abfragen nachverfolgt wird. | Auto | Für alle Datenbanken erzwungen |
| DATA_FLUSH_INTERVAL_SECONDS | Gibt an, wie lange gesammelte Laufzeitstatistiken maximal im Arbeitsspeicher aufbewahrt werden, bevor eine Leerung auf einen Datenträger erfolgt. | 900 | Für neue Datenbanken verbindlich |
Wichtig
Diese Standardeinstellungen werden in der letzten Phase der Abfragespeicheraktivierung automatisch in einer Azure SQL-Datenbank-Instanz angewendet. Nach der Aktivierung ändert Azure SQL-Datenbank keine von Kunden festgelegten Konfigurationswerte mehr, es sei denn, sie wirken sich negativ auf die primäre Arbeitslast oder den zuverlässigen Betrieb des Abfragespeicher aus.
Hinweis
In Azure SQL-Datenbank mit einer Einzeldatenbank oder einem Pool für elastische Datenbanken kann der Abfragespeicher nicht deaktiviert werden. Beim Ausführen von ALTER DATABASE [database] SET QUERY_STORE = OFF wird die Warnung 'QUERY_STORE=OFF' is not supported in this version of SQL Server. zurückgegeben.
Wenn Sie ihre benutzerdefinierten Einstellungen beibehalten möchten, verwenden Sie ALTER DATABASE Abfragespeicher Optionen, um die Konfiguration auf den vorherigen Zustand zurück zu setzen. Informationen zur Auswahl der optimalen Konfigurationsparameter finden Sie im Artikel Bewährte Methoden für den Abfragespeicher.
Hinweis
Viele ALTER DATABASE Vorgänge machen den Plancache für die betroffene Datenbank ungültig, darunter Änderungen an Datenbankoptionen, Sortierungseinstellungen, der Kompatibilitätsebene, datenbankbezogenen Konfigurationen und Dateigruppeneigenschaften. Nachdem der Vorgang den Plancache gelöscht hat, müssen nachfolgende Abfrageausführungen neu kompiliert werden, was sich auf die Systemleistung auswirken kann.
Festlegen des optimalen Erfassungsmodus für den Abfragespeicher
Behalten Sie die wichtigsten Daten im Abfragespeicher. Die folgende Tabelle beschreibt die typischen Szenarios für jeden Erfassungsmodus für den Abfragespeicher:
| Erfassungsmodus für den Abfragespeicher | Szenario |
|---|---|
| Alle | Analysieren Sie Ihre Arbeitsauslastung sorgfältig im Hinblick auf alle Abfrageformen und deren Ausführungshäufigkeit und andere Statistiken. Identifizieren Sie neue Abfragen in Ihrer Workload. Erkennen Sie, ob Ad-hoc-Abfragen verwendet werden, um Möglichkeiten für Benutzer oder eine automatische Parametrisierung zu identifizieren. Hinweis: Dies ist der Standarderfassungsmodus in SQL Server 2016 (13.x) und SQL Server 2017 (14.x). |
| Automatisch | Konzentrieren Sie sich auf relevante und verwertbare Abfragen. Zum Beispiel auf jene Abfragen, die regelmäßig ausgeführt werden oder einen erheblichen Ressourcenverbrauch aufweisen. Hinweis: In SQL Server 2019 (15.x) und höheren Versionen ist dies der Standarderfassungsmodus. |
| None | Sie haben bereits den Abfragesatz erfasst, den Sie während der Laufzeit überwachen möchten, und möchten nun Ablenkungen beseitigen, die durch andere Abfragen entstehen können. Keines davon ist für Test- und Benchmarking-Umgebungen geeignet. Keine ist auch für Softwareanbieter geeignet, die eine Abfragespeicher-Konfiguration mit ausliefern, die zur Überwachung der Anwendungsworkload konfiguriert ist. „Keine“ sollte mit Bedacht verwendet werden, da Sie womöglich die Gelegenheit verpassen, wichtige neue Abfragen nachzuverfolgen und zu optimieren. Vermeiden Sie die Verwendung von None, es sei denn, Sie haben ein spezifisches Szenario, das dies erfordert. |
| Benutzerdefiniert | SQL Server 2019 (15.x) führte einen benutzerdefinierten Erfassungsmodus unter dem ALTER DATABASE ... SET QUERY_STORE-Befehl ein. Obwohl Auto die Standardeinstellung ist und empfohlen wird, können Datenbankadministratoren, wenn sie Bedenken wegen des Mehraufwands haben, den der Abfragespeicher verursachen könnte, benutzerdefinierte Erfassungsrichtlinien verwenden, um das Erfassungsverhalten des Abfragespeichers weiter zu optimieren. Weitere Informationen und Empfehlungen finden Sie weiter unten in diesem Artikel unter Benutzerdefinierte Erfassungsrichtlinien. Weitere Informationen zu dieser Syntax finden Sie unter ALTER DATABASE SET "Optionen". |
Hinweis
Cursor, Abfragen in gespeicherten Prozeduren und nativ kompilierte Abfragen werden immer erfasst, wenn der Erfassungsmodus für den Abfragespeicher auf Alle (ALL), Automatisch (AUTO) oder Benutzerdefiniert (CUSTOM) festgelegt ist. Zum Erfassen von nativ kompilierten Abfragen aktivieren Sie die Sammlung von Statistiken pro Abfrage mithilfe von sys.sp_xtp_control_query_exec_stats.
Aufbewahren der relevantesten Daten im Abfragespeicher
Konfigurieren Sie den Abfragespeicher so, dass nur die relevanten Daten enthalten sind. Dann wird er kontinuierlich ausgeführt, was die Problembehandlung erheblich vereinfacht bei minimalen Auswirkungen auf die normale Arbeitsauslastung.
Die folgende Tabelle enthält bewährte Methoden:
| Bewährte Vorgehensweise | Einstellung |
|---|---|
| Begrenzen der Menge von beibehaltenen Verlaufsdaten. | Konfigurieren Sie die zeitbasierte Richtlinie, um die automatische Bereinigung zu aktivieren. |
| Filtern Sie nicht relevante Abfragen heraus. | Konfigurieren Sie den Erfassungsmodus für den Abfragespeicher als Automatisch. |
| Löschen Sie weniger relevanten Abfragen, wenn die maximale Größe erreicht ist. | Aktivieren Sie die größenbasierte Cleanuprichtlinie. |
Benutzerdefinierte Erfassungsrichtlinien
Wenn der Benutzerdefinierte Abfragespeicher- Erfassungsmodus aktiviert ist, sind zusätzliche Abfragespeicher-Konfigurationen unter einer neuen Abfragespeicher- Erfassungsrichtlinieneinstellung verfügbar, um die Datensammlung auf einem bestimmten Server fein abzustimmen.
Die neuen benutzerdefinierten Einstellungen definieren, was während des Zeitschwellenwerts für die interne Erfassungsrichtlinie geschieht. Dies ist eine Zeitgrenze, innerhalb derer die konfigurierbaren Bedingungen ausgewertet werden; wenn eine davon zutrifft, kann die Abfrage von Abfragespeicher erfasst werden.
Abfragespeicher- Erfassungsmodus: gibt die Abfrageerfassungsrichtlinie für den Abfragespeicher an.
- Alle: erfasst alle Abfragen. Diese Option ist die Standardeinstellung in SQL Server 2016 (13.x) und SQL Server 2017 (14.x).
- Automatisch: Unregelmäßige Abfragen und Abfragen mit unbedeutender Kompilierungs- und Ausführungsdauer werden ignoriert. Die Schwellenwerte für die Dauer der Ausführungsanzahl, Kompilierung und Laufzeit werden intern bestimmt. Ab SQL Server 2019 (15.x) ist dies die Standardoption.
- Keine: Der Abfragespeicher beendet die Erfassung neuer Abfragen.
- Benutzerdefiniert: Bietet zusätzliche Steuerungsmöglichkeiten und ermöglicht die Optimierung der Datensammlungsrichtlinie. Die neuen benutzerdefinierten Einstellungen definieren, was während des Zeitschwellenwerts für die interne Erfassungsrichtlinie geschieht. Dies ist eine Zeitgrenze, innerhalb derer die konfigurierbaren Bedingungen ausgewertet werden; wenn eine davon zutrifft, kann die Abfrage von Abfragespeicher erfasst werden.
Die Optimierung einer geeigneten benutzerdefinierten Erfassungsrichtlinie für Ihre Umgebung sollte in folgenden Fällen berücksichtigt werden:
- Die Datenbank ist sehr groß.
- Die Datenbank verfügt über eine große Anzahl eindeutiger Ad-hoc-Abfragen.
- Die Datenbank weist spezifische Größen- oder Wachstumsbeschränkungen auf.
So zeigen Sie die aktuellen Einstellungen in Management Studio an:
- Klicken Sie im Objekt-Explorer von SQL Server Management Studio mit der rechten Maustaste auf die Datenbank.
- Wählen Sie Eigenschaften aus.
- Abfragespeicher auswählen. Überprüfen Sie auf der Seite Abfragespeicher, ob der Betriebsmodus (angefordert)Lesen/Schreiben ist.
- Ändern Sie Abfragespeicher Erfassungsmodus in Benutzerdefiniert.
- Beachten Sie, dass die vier Erfassungsrichtlinienfelder unter Abfragespeicher Erfassungsrichtlinie jetzt aktiviert und konfigurierbar sind.
Beispiel für benutzerdefinierte Erfassungsrichtlinien
Im folgenden Beispiel wird QUERY_CAPTURE_MODE auf AUTO festgelegt und ein benutzerdefinierter Erfassungsmodus festgelegt. Jeder der folgenden Richtlinien legt die benutzerdefinierten Erfassungsrichtlinien auf seinen Standardwert in SQL Server 2022 (16.x) fest. Erwägen Sie, diese Werte anzupassen, um die Anzahl der erfassten Abfragen zu verringern und damit den Speicherplatzbedarf des Abfragespeicher auf dem Datenträger zu reduzieren. Es wird empfohlen, diese Werte schrittweise in kleinen Schritten zu ändern.
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE = ON
(
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = 90 ),
DATA_FLUSH_INTERVAL_SECONDS = 900,
MAX_STORAGE_SIZE_MB = 1000,
INTERVAL_LENGTH_MINUTES = 60,
SIZE_BASED_CLEANUP_MODE = AUTO,
QUERY_CAPTURE_MODE = CUSTOM,
QUERY_CAPTURE_POLICY = (
STALE_CAPTURE_POLICY_THRESHOLD = 24 HOURS,
EXECUTION_COUNT = 30,
TOTAL_COMPILE_CPU_TIME_MS = 1000,
TOTAL_EXECUTION_CPU_TIME_MS = 100
)
);
Die folgende Beispielabfrage ändert einen vorhandenen Abfragespeicher so, dass eine benutzerdefinierte Erfassungsrichtlinie verwendet wird, die die Standardeinstellungen für EXECUTION_COUNT und TOTAL_COMPILE_CPU_TIME_MS überschreibt.
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE = ON
(
QUERY_CAPTURE_MODE = CUSTOM,
QUERY_CAPTURE_POLICY = (
EXECUTION_COUNT = 100,
TOTAL_COMPILE_CPU_TIME_MS = 10000
)
);
Maximale Größe von Abfragespeicher
Der standardmäßige maximale Größenwert der Abfragespeicher beträgt 1000 MB, beginnend mit SQL Server 2019 (15,x). In früheren Versionen betrug der Standardwert 100 MB. Das Erhöhen der maximalen Größenbeschränkung der Abfragespeicher ist in einer besetzten Datenbank mit vielen eindeutigen Abfrageplänen angemessen. Das Anpassen der Erfassungsrichtlinie (siehe vorheriger Abschnitt) ist ein wichtigerer Aspekt, um die Größe des Abfragespeicher auf dem Datenträger zu beschränken und zu verhindern, dass der Abfragespeicher in den READ_ONLY-Modus wechselt. Während Abfragespeicher Abfragen, Ausführungspläne und Statistiken sammelt, wächst seine Größe in der Datenbank, bis dieser Grenzwert erreicht ist. Wenn das passiert, ändert der Abfragespeicher den Betriebsmodus automatisch in READ_ONLY und beendet die Erfassung neuer Daten, was bedeutet, dass Ihre Leistungsanalyse nicht mehr genau ist.
- In SQL Server und Azure SQL Managed Instance wird das Limit
MAX_STORAGE_SIZE_MBnicht strikt erzwungen. - In Azure SQL-Datenbank beträgt der maximal zulässige
MAX_STORAGE_SIZE_MB-Wert 10.240 MB.
Die Speichergröße wird nur überprüft, wenn der Abfragespeicher Daten auf einen Datenträger schreibt. Dieses Intervall wird durch die Option DATA_FLUSH_INTERVAL_SECONDS oder die Option Datenleerungsintervall im Dialogfeld des Management Studio-Abfragespeichers festgelegt.
- Der Standardwert des Intervalls liegt bei 900 Sekunden (oder 15 Minuten).
- Wenn der Abfragespeicher zwischen den Überprüfungen der Speichergröße den Grenzwert
MAX_STORAGE_SIZE_MBüberschritten hat, wechselt er in den schreibgeschützten Modus. - Wenn
SIZE_BASED_CLEANUP_MODEaktiviert ist, wird auch der Bereinigungsmechanismus zur Durchsetzung des LimitsMAX_STORAGE_SIZE_MBausgelöst.- Sobald genügend Speicherplatz freigegeben wurde, wechselt der Abfragespeicher-Modus automatisch zurück in den READ_WRITE-Modus.
Weitere Informationen finden Sie unter ALTER DATABASE SET OPTION MAX_STORAGE_SIZE_MB.
Datenleerungsintervall (Minuten)
Das Datenflush-Intervall legt fest, in welchen Abständen die erfassten Laufzeitstatistiken auf der Festplatte gespeichert werden. In SQL Server Management Studio wird der Wert in Minuten angegeben, aber in Transact-SQL wird er in Sekunden ausgedrückt. Der Standardwert beträgt 15 Minuten (900 Sekunden).
- Das Erhöhen des Datenleerungsintervalls kann die gesamte Speicher-E/A des Abfragespeicherspeichers verringern, aber gleichzeitig die Speicher-E/A der Arbeitsauslastung stark erhöhen. Die Datenträgerauslastung wird dabei zwar seltener, aber dafür stärker beeinträchtigt. Ziehen Sie in Betracht, einen höheren Wert zu verwenden, wenn Ihre Arbeitsauslastung keine große Anzahl verschiedener Abfragen und Pläne generiert oder Sie längere Zeit warten können, bevor Daten vor dem Herunterfahren der Datenbank persistent gespeichert werden.
- Wenn Sie das Intervall für den Datenabgleich verringern, verringert sich die Menge der Abfragespeicherdaten, die im Falle eines Herunterfahrens, eines Stromausfalls oder eines Failovers verloren gehen würden. Dies kann auch die Auswirkungen auf die Speicher-E/A aus dem Abfragespeicher mindern, indem häufiger, aber mit weniger Daten auf den Datenträger geschrieben wird.
Hinweis
Durch die Verwendung des Traceflags 7745 wird verhindert, dass Abfragespeicher-Daten im Fall eines Failovers oder eines Herunterfahrbefehls auf den Datenträger geschrieben werden. Weitere Informationen finden Sie unter Verwenden von Abfragespeicher in unternehmenskritischen Servern.
Ändern Abfragespeicher-Standardeinstellungen
Konfigurieren Sie Abfragespeicher basierend auf Ihrer Arbeitsauslastung und Ihren Anforderungen an die Behandlung von Leistungsproblemen. Die Standardparameter sind für den Einstieg ausreichend, Sie sollten jedoch das Verhalten des Abfragespeichers im Verlauf der Zeit überwachen und die Konfiguration entsprechend anpassen.
Aktuelle Einstellungen von Abfragespeicher anzeigen
Zeigen Sie die aktuellen Abfragespeicher-Einstellungen in SQL Server Management Studio (SSMS) oder T-SQL an.
So zeigen Sie die aktuellen Einstellungen in Management Studio an:
- Klicken Sie im Objekt-Explorer von SQL Server Management Studio mit der rechten Maustaste auf die Datenbank.
- Wählen Sie Eigenschaften aus.
- Abfragespeicher auswählen.
Im folgenden Skript wird ein neuer Wert für Maximale Größe (MB) festgelegt:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE (MAX_STORAGE_SIZE_MB = 1024);
Verwenden Sie SQL Server Management Studio oder Transact-SQL, um verschiedene Werte für das Datenleerungsintervall festzulegen:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE (DATA_FLUSH_INTERVAL_SECONDS = 900);
Statistikerfassungsintervall: definiert die Granularität für die gesammelten Laufzeitstatistiken, ausgedrückt in Minuten. Der Standardwert ist 60 Minuten. Es ist ratsam, einen niedrigeren Wert zu verwenden, wenn Sie eine höhere Granularität benötigen oder weniger Zeit zum Erkennen und Verringern von Problemen haben. Denken Sie daran, dass der Wert die Größe der Abfragespeicherdaten direkt beeinflusst. Verwenden Sie SQL Server Management Studio oder Transact-SQL, um einen anderen Wert für das Statistiksammlungsintervall festzulegen:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE (INTERVAL_LENGTH_MINUTES = 60);
Schwellenwert für veraltete Abfrage (Tage): Zeitbasierte Cleanuprichtlinie, die die Aufbewahrungsdauer für persistente Laufzeitstatistiken und inaktive Abfragen steuert, ausgedrückt in Tagen. Standardmäßig ist der Abfragespeicher so konfiguriert, dass Daten 30 Tage lang gespeichert werden. Dies ist möglicherweise für Ihr Szenario unnötig lange.
Vermeiden Sie es, Verlaufsdaten aufzubewahren, die Sie nicht mehr verwenden möchten. Dies reduziert die Wahrscheinlichkeit für Änderungen in den schreibgeschützten Status. Die Größe der Abfragespeicherdaten sowie die Zeit, um Probleme zu erkennen und zu mindern, lassen sich besser vorhersagen. Verwenden Sie Management Studio oder das folgende Skript, um die zeitbasierte Cleanuprichtlinie zu konfigurieren:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE (CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 90));
Größenbasierter Bereinigungsmodus: gibt an, ob das automatische Cleanup ausgeführt wird, wenn der Umfang der Abfragespeicherdaten den Grenzwert erreicht. Aktivieren Sie die größenbasierte Bereinigung, um sicherzustellen, dass der Abfragespeicher immer im Lese-/ Schreibmodus ausgeführt wird und die neuesten Daten erfasst. Bei hohen Arbeitsauslastungen gibt es keine Garantie dafür, dass die Bereinigung des Abfragespeichers die Datengröße stets unter dem Grenzwert hält. Es ist möglich, dass die automatische Datenbereinigung in Rückstand gerät und (vorübergehend) in den schreibgeschützten Modus wechselt.
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE (SIZE_BASED_CLEANUP_MODE = AUTO);
Erfassungsmodus für den Abfragespeicher: gibt die Abfrageerfassungsrichtlinie für Abfragespeicher an.
- Alle: erfasst alle Abfragen. Diese Option ist die Standardeinstellung in SQL Server 2016 (13.x) und SQL Server 2017 (14.x).
- Automatisch: Unregelmäßige Abfragen und Abfragen mit unbedeutender Kompilierungs- und Ausführungsdauer werden ignoriert. Die Schwellenwerte für die Dauer der Ausführungsanzahl, Kompilierung und Laufzeit werden intern bestimmt. Ab SQL Server 2019 (15.x) ist dies die Standardoption.
- Keine: Der Abfragespeicher beendet die Erfassung neuer Abfragen.
- Benutzerdefiniert: Bietet zusätzliche Steuerungsmöglichkeiten und ermöglicht die Optimierung der Datensammlungsrichtlinie. Die neuen benutzerdefinierten Einstellungen definieren, was während des Zeitschwellenwerts für die interne Erfassungsrichtlinie geschieht. Dies ist eine Zeitgrenze, innerhalb derer die konfigurierbaren Bedingungen ausgewertet werden; wenn eine davon zutrifft, kann die Abfrage von Abfragespeicher erfasst werden.
Wichtig
Cursor, Abfragen in gespeicherten Prozeduren und nativ kompilierte Abfragen werden immer erfasst, wenn der Erfassungsmodus für den Abfragespeicher auf Alle (ALL), Automatisch (AUTO) oder Benutzerdefiniert (CUSTOM) festgelegt ist. Zum Erfassen von nativ kompilierten Abfragen aktivieren Sie die Sammlung von Statistiken pro Abfrage mithilfe von sys.sp_xtp_control_query_exec_stats.
Das folgende Skript legt QUERY_CAPTURE_MODE auf AUTO fest:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE (QUERY_CAPTURE_MODE = AUTO);
Beispiele
Im folgenden Beispiel wird QUERY_CAPTURE_MODE auf AUTO gesetzt und es werden weitere empfohlene Optionen in SQL Server 2016 (13.x) festgelegt:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE = ON
(
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = 90 ),
DATA_FLUSH_INTERVAL_SECONDS = 900,
QUERY_CAPTURE_MODE = AUTO,
MAX_STORAGE_SIZE_MB = 1000,
INTERVAL_LENGTH_MINUTES = 60
);
Im folgenden Beispiel wird QUERY_CAPTURE_MODE auf AUTO gesetzt und es werden weitere empfohlene Optionen in SQL Server 2017 (14.x) zum Einschließen von Wartezeitstatistiken festgelegt:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE = ON
(
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = 90 ),
DATA_FLUSH_INTERVAL_SECONDS = 900,
QUERY_CAPTURE_MODE = AUTO,
MAX_STORAGE_SIZE_MB = 1000,
INTERVAL_LENGTH_MINUTES = 60,
SIZE_BASED_CLEANUP_MODE = AUTO,
MAX_PLANS_PER_QUERY = 200,
WAIT_STATS_CAPTURE_MODE = ON
);
Das folgende Beispiel setzt die CUSTOM-Erfassungsrichtlinie auf die Standardwerte von SQL Server 2019 (15.x) statt auf den neuen Standardmodus der automatischen Erfassung. Weitere Informationen zu benutzerdefinierten Erfassungsrichtlinienoptionen und -standardwerten finden Sie unter <query_capture_policy_option_list>.
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE = ON
(
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = 90 ),
DATA_FLUSH_INTERVAL_SECONDS = 900,
MAX_STORAGE_SIZE_MB = 1000,
INTERVAL_LENGTH_MINUTES = 60,
SIZE_BASED_CLEANUP_MODE = AUTO,
MAX_PLANS_PER_QUERY = 200,
WAIT_STATS_CAPTURE_MODE = ON,
QUERY_CAPTURE_MODE = CUSTOM,
QUERY_CAPTURE_POLICY = (
STALE_CAPTURE_POLICY_THRESHOLD = 24 HOURS,
EXECUTION_COUNT = 30,
TOTAL_COMPILE_CPU_TIME_MS = 1000,
TOTAL_EXECUTION_CPU_TIME_MS = 100
)
);
Abfragespeicher-Wartung
Dieser Abschnitt enthält einige Richtlinien zum Verwalten des Abfragespeichers selbst.
Status von Abfragespeicher
Der Abfragespeicher speichert seine Daten in der Benutzerdatenbank und besitzt aus diesem Grund eine Größenbegrenzung (konfiguriert mit MAX_STORAGE_SIZE_MB). Wenn die Daten im Abfragespeicher dieses Limit erreichen, ändert sich der Status automatisch vom Lese-/Schreibzugriff in den schreibgeschützten Modus, und es werden keine neuen Daten mehr erfasst.
Fragen Sie sys.database_query_store_options ab, um zu ermitteln, ob Abfragespeicher zurzeit aktiv ist und ob derzeit Laufzeitstatistiken erfasst werden oder nicht.
SELECT actual_state, actual_state_desc, readonly_reason,
current_storage_size_mb, max_storage_size_mb
FROM sys.database_query_store_options;
Der Status des Abfragespeichers wird durch die Spalte actual_state bestimmt. Wenn er vom gewünschten Status abweicht, können Sie über die readonly_reason-Spalte weitere Informationen erhalten. Wenn die Größe des Abfragespeichers das Kontingent überschreitet, wechselt das Feature in den schreibgeschützten Modus („read_only“) und gibt einen Grund an. Informationen zu Gründen finden Sie unter sys.database_query_store_options.
Optionen für Abfragespeicher abrufen
Führen Sie zum Abrufen detaillierter Informationen zum Status des Abfragespeichers Folgendes in einer Benutzerdatenbank aus.
SELECT * FROM sys.database_query_store_options;
Festlegen des Abfragespeicherintervalls
Sie können das Intervall zum Sammeln von Statistiken zur Abfragelaufzeit überschreiben (der Standardwert ist 60 Minuten). Der neue Wert für das Intervall ist über die Ansicht sys.database_query_store_options verfügbar.
ALTER DATABASE <database_name>
SET QUERY_STORE (INTERVAL_LENGTH_MINUTES = 15);
Beliebige Werte sind für INTERVAL_LENGTH_MINUTES nicht zulässig. Sie können eine der folgenden Intervalle verwenden: 1, 5, 10, 15, 30, 60 oder 1440 Minuten.
Hinweis
Für Azure Synapse Analytics wird das Anpassen der Konfigurationsoptionen für den Abfragespeicher, wie in diesem Abschnitt veranschaulicht, nicht unterstützt.
Speicherplatzbelegung des Abfragespeicher
Um die aktuelle Größe und den Grenzwert des Abfragespeicher zu überprüfen, führen Sie in der Benutzerdatenbank die folgende Anweisung aus.
SELECT current_storage_size_mb, max_storage_size_mb
FROM sys.database_query_store_options;
Mit der folgenden Anweisung können Sie den Speicher erweitern, wenn der Abfragespeicher voll ist.
ALTER DATABASE <database_name>
SET QUERY_STORE (MAX_STORAGE_SIZE_MB = <new_size>);
Festlegen von Optionen zum Abfragespeicher
Sie können mehrere Abfragespeicher Optionen gleichzeitig mit einer einzelnen ALTER DATABASE Anweisung festlegen.
ALTER DATABASE <database name>
SET QUERY_STORE (
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),
DATA_FLUSH_INTERVAL_SECONDS = 3000,
MAX_STORAGE_SIZE_MB = 500,
INTERVAL_LENGTH_MINUTES = 15,
SIZE_BASED_CLEANUP_MODE = AUTO,
QUERY_CAPTURE_MODE = AUTO,
MAX_PLANS_PER_QUERY = 1000,
WAIT_STATS_CAPTURE_MODE = ON
);
Die vollständige Liste der Konfigurationsoptionen finden Sie unter ALTER DATABASE SET "Optionen(Transact-SQL)".
Speicherplatz bereinigen
Die internen Tabellen des Abfragespeichers werden beim Erstellen der Datenbank in der PRIMÄREN Dateigruppe erstellt. Diese Konfiguration kann später nicht mehr geändert werden. Wenn nicht mehr genügend Speicherplatz vorhanden ist, sollten Sie mithilfe der folgenden Anweisung ältere Daten aus dem Abfragespeicher löschen:
ALTER DATABASE <db_name> SET QUERY_STORE CLEAR;
Sie können auch nur Ad-hoc-Abfragedaten löschen, da diese evtl. für die Abfrageoptimierung und Plananalyse weniger wichtig sind, aber trotzdem viel Platz einnehmen.
In Azure Synapse Analytics ist das Löschen des Abfragespeichers nicht verfügbar. Daten werden automatisch für die letzten 7 Tage aufbewahrt.
Löschen von Ad-hoc-Abfragen
Dadurch werden Ad-hoc-Abfragen und interne Abfragen aus dem Abfragespeicher gelöscht, damit der Abfragespeicher über ausreichend Speicherplatz verfügt und keine Abfragen entfernt, die unbedingt nachverfolgt werden müssen.
SET NOCOUNT ON
-- This purges adhoc and internal queries from
-- the Query Store in the current database
-- so that the Query Store does not run out of space
-- and remove queries we really need to track
DECLARE @id int;
DECLARE adhoc_queries_cursor CURSOR
FOR
SELECT q.query_id
FROM sys.query_store_query_text AS qt
JOIN sys.query_store_query AS q
ON q.query_text_id = qt.query_text_id
JOIN sys.query_store_plan AS p
ON p.query_id = q.query_id
JOIN sys.query_store_runtime_stats AS rs
ON rs.plan_id = p.plan_id
WHERE q.is_internal_query = 1 -- is it an internal query then we dont care to keep track of it
OR q.object_id = 0 -- if it does not have a valid object_id then it is an adhoc query and we don't care about keeping track of it
GROUP BY q.query_id
HAVING MAX(rs.last_execution_time) < DATEADD (minute, -5, GETUTCDATE()) -- if it has been more than 5 minutes since the adhoc query ran
ORDER BY q.query_id;
OPEN adhoc_queries_cursor ;
FETCH NEXT FROM adhoc_queries_cursor INTO @id;
WHILE @@fetch_status = 0
BEGIN
PRINT 'EXEC sp_query_store_remove_query ' + str(@id);
EXEC sp_query_store_remove_query @id;
FETCH NEXT FROM adhoc_queries_cursor INTO @id;
END
CLOSE adhoc_queries_cursor;
DEALLOCATE adhoc_queries_cursor;
Sie können eine eigene Prozedur mit abweichender Logik für das Bereinigen von Daten definieren, die Sie nicht mehr benötigen.
Im vorhergehenden Beispiel wird die erweiterte gespeicherte Prozedur sp_query_store_remove_query verwendet, um nicht benötigte Daten zu entfernen. Sie können außerdem:
- Verwenden Sie
sp_query_store_reset_exec_stats, um die Laufzeitstatistiken für einen angegebenen Plan zu löschen. - Verwenden Sie
sp_query_store_remove_plan, um einen einzelnen Plan zu entfernen.
Zugehöriger Inhalt
- ALTER DATABASE SET Optionen (Transact-SQL)
- Katalogsichten des Abfragespeichers (Transact-SQL)
- Gespeicherte Prozeduren für den Abfragespeicher (Transact-SQL)
- Verwenden Sie den Abfragespeicher mit In-Memory OLTP
- Leitfaden zur Architektur der Abfrageverarbeitung
- Abfragespeicher-Hinweise
- Überwachen der Leistung mithilfe des Abfragespeichers
- Leistung mit dem Abfragespeicher optimieren
- Speicherung und Analyse des Abfrageverlaufs in Azure Synapse Analytics