Welchen Vorteil hat die Aktivierung des Query Store in msdb?

9

Der Abfragespeicher der SQL-Systemdatenbank (Master, Modell, msdb, tempdb) kann nur für msdb verwendet werden. Ich habe nach einer Dokumentation zum Abfragespeicher in msdb gesucht und keine gefunden.

Während Sie es in der GUI nicht sehen können, kann es auf Ihrer SQL 2016-Instanz überprüft werden

Validate Query Store ist deaktiviert

USE msdb
SELECT * FROM sys.database_query_store_options; 

Aktivieren Sie den Abfragespeicher

USE [master]
GO
ALTER DATABASE msdb SET QUERY_STORE = ON
GO
ALTER DATABASE msdb SET QUERY_STORE (OPERATION_MODE = READ_WRITE
, INTERVAL_LENGTH_MINUTES = 30
, MAX_STORAGE_SIZE_MB = 1000
, QUERY_CAPTURE_MODE = AUTO)
GO

Validate Query Store ist aktiviert

USE msdb
SELECT * FROM sys.database_query_store_options; 

Warum ist msdb von allen Systemdatenbanken die einzige mit der Option, Query Store zu verwenden, und welchen Wert bietet es?

-- Stop Query Store
USE [master]
GO
ALTER DATABASE msdb SET QUERY_STORE = OFF
GO
James Jenkins
quelle
James, bitte sieh dir mein Antwort-Update an [model], das sich auf die Aufnahme in die Liste "nicht erlaubt" bezieht .
Solomon Rutzky
@SolomonRutzky Ich sehe, sehr interessant. Ich habe Kommentare unter Ihrer Antwort. Sie können Ihre Antwort gerne weiter ausbauen.
James Jenkins
@SolomonRutzky Eigentlich ist vielleicht eine neue Frage in Ordnung. Siehe Kann ich den Abfragespeicher automatisch aktivieren, wenn ich neue Datenbanken erstelle?
James Jenkins

Antworten:

7

Microsoft, das eine Funktion aktiviert, bedeutet nicht, dass sie für alle nützlich ist. Für Systeme, die einige der Funktionen verwenden, kann dies bedeuten, dass Sie sich auf in MSDB gespeicherte Informationen verlassen. In diesen Fällen kann der Abfragespeicher hilfreich sein.

Hier finden Sie einige Artikel zur Verwendung und Optimierung von MSDB-Datenbankobjekten.

msdb Datenbank aus Büchern online.

MSDB Performance Tuning von Geoff N. Hiten

Die Bedeutung der Wartung von MSDB durch Tim Radney, wo er Folgendes erwähnte:

Das Optimieren von Indizes in msdb ist genauso wichtig wie Ihre Benutzerdatenbanken. Oft habe ich Clients gefunden, die Benutzerdatenbanken optimieren, aber nicht die Systemdatenbanken. Da die msdb-Datenbank häufig von SQL Server Agent, Protokollversand, Service Broker, SSIS, Sicherung und Wiederherstellung sowie anderen Prozessen verwendet wird, können die Indizes stark fragmentiert werden. Stellen Sie sicher, dass Ihre Indexoptimierungsjobs auch Ihre Systemdatenbanken oder zumindest msdb enthalten. Ich habe gesehen, dass Indexoptimierungen mehrere Gigabyte Speicherplatz aus stark fragmentierten Indizes in msdb freigeben.

Ich kann sehen, wie der Abfragespeicher bei der Optimierung Ihrer Indizierungsstrategie und beim optimalen Abfragen / Aggrgieren / Löschen einiger in MSDB gespeicherter Informationen helfen kann.

SqlWorldWide
quelle
1
Zusätzlich zu den [msdb]im Zitat angegebenen Funktionen umfassen die "anderen Prozesse" Dinge wie: dbmail, CMS-Dienste (Central Management Server) (insbesondere freigegebene Listen registrierter Server), ich denke, jemand in den Kommentaren zu diesem verlinkten Beitrag erwähnt Policy Based Management (PBM) und ich denke Server Audits (zumindest die Definitionen, aber ich habe dies nicht bestätigt).
Solomon Rutzky
5

@SqlWorldWide hat den "Warum [msdb]" -Teil der Frage beantwortet, damit ich das hier nicht dupliziere. Aber zu beantworten das „Warum nicht [master], [model], [tempdb]“ Teil der Frage:

  • [tempdb]ist eine temporäre Speicherung und scheint naturgemäß weder von einer automatisierten Optimierung noch von der Fähigkeit zur Bereitstellung historischer Analysen zu profitieren. Wenn der Abfragespeicher Ausführungsstatistiken für gespeicherte Prozeduren verfolgt, hilft dies hier nicht, wenn die gespeicherten Prozeduren an anderer Stelle vorhanden sind. Während es möglich ist, temporäre gespeicherte Prozeduren zu erstellen, würden lokale temporäre gespeicherte Prozeduren wahrscheinlich nicht davon profitieren, da ihr Name einen eindeutigen Hash-Code enthält, um ähnliche Namen über mehrere Sitzungen hinweg zu trennen. Und während globale temporäre gespeicherte Prozesse über Sitzungen hinweg einen einheitlichen Namen haben, kann angesichts der temporären Natur nicht davon ausgegangen werden, dass globale temporäre gespeicherte Prozesse mit demselben Namen über Sitzungen hinweg (vorausgesetzt, nicht zur gleichen Zeit) sogar denselben Code haben. und kann daher nicht sinnvoll sein /korrelierbare Statistiken.

  • [model]ist die Vorlage zum Erstellen neuer Datenbanken (einschließlich der Vorlage [tempdb], die bei jedem Start / Neustart der SQL Server-Instanz neu erstellt wird). Abfragen werden von hier aus nicht ausgeführt. Ich nehme jedoch an, dass es möglicherweise sinnvoll ist, die Aktivierung des Abfragespeichers hier so zuzulassen, dass er beim Erstellen neuer DBs standardmäßig aktiviert ist. Aber jedoch zu , dass aber das würde bedeuten, Abfrage - Shop aktiviert werden würde [tempdb], und das ist einfach albern (siehe Punkt direkt oben).

    UPDATE:
    Woah, Nelly! Ich habe gerade die erste Frage , die zu dieser führte, noch einmal gelesen und etwas Seltsames bemerkt: Es gab nur Fehlermeldungen für [master]und [tempdb]; Es wurde kein Fehler gemeldet [model]. Es ist möglich, dass das OP diese Fehlermeldung beim Kopieren in die Frage einfach weggelassen hat. Daher habe ich unter SQL Server 2016 SP1-CU7-DDR (13.0.4466.4) Folgendes ausgeführt, um mich selbst davon zu überzeugen:

    ALTER DATABASE [model] SET QUERY_STORE = ON; -- completes successfully!
    
    -- Restart instance to force recreation of [tempdb];
    
    CREATE DATABASE [IsQueryStoreEnabledByDefault];
    
    SELECT * FROM sys.databases WHERE [is_query_store_on] = 1;
    
    DROP DATABASE [IsQueryStoreEnabledByDefault];

    Und die Ergebnisse? [model]und [IsQueryStoreEnabledByDefault]zurückgegeben werden , aber [tempdb]ist nicht in den Ergebnissen! So wird ein zusätzlicher jedoch auf die ersten beiden „aber“ s, scheint es , dass [model] kann Abfrage - Shop aktiviert , die a) defaults Abfrage gespeicherter Enablement (ja, es ist ein Wort, Ich habe auch ;-) für neu DBs erstellt, und b) wird für die Neuerstellung [tempdb]beim Starten des Dienstes ignoriert (daher ist dies keine Hintertür zum Einschalten [tempdb]).  

  • [master]ist die Hauptsystemdatenbank und Sie sollten hier keinen Code ausführen. Außerdem würden die hier vorhandenen und häufig verwendeten gespeicherten Prozeduren entweder nicht von einer Optimierung profitieren oder im Kontext der Benutzerdatenbank ausgeführt, in der sie aufgerufen werden (dh systemgespeicherte Prozesse, die mit beginnen, sp_sind ein Sonderfall, in dem sie insgesamt "erscheinen" DBs - müssen nicht vollständig qualifiziert sein [master]..- und werden so ausgeführt, als ob sie tatsächlich in jeder DB vorhanden wären. Sie werden wahrscheinlich vom Abfragespeicher in den Benutzerdatenbanken verwaltet, in denen sie aufgerufen werden.

Solomon Rutzky
quelle
Wenn Sie das USE-Modell SELECT * FROM sys.database_query_store_options ausführen; Nachdem Sie den Modell-Abfragespeicher aktiviert haben, wird er nicht wie aktiviert angezeigt. ABER> Wie Sie sagen, hat die neue Datenbank sie aktiviert. In meinem Fall wurden die optionalen Änderungen verwendet, die ich ausgewählt hatte, als ich früher am Tag darauf geschlagen habe. Wenn Sie also model verwenden möchten, möchten Sie wahrscheinlich alle Query Store-Optionen nach Ihren Wünschen einstellen, um Überraschungen zu vermeiden.
James Jenkins