Teilen über


Beibehaltene Statistiken für lesbare Secondärdateien

Gilt für: SQL Server 2025 (17.x) Azure SQL-Datenbank

Der Abfragespeicher für lesbare Secondärdateien ist in SQL Server 2025 (17.x) und Azure SQL-Datenbank verfügbar, und die permanente Statistik für lesbare Secondärdateien verwendet die Infrastruktur, die der Abfragespeicher für lesbare Secondärdateien eingerichtet hat.

Der Abfragespeicher für lesbare Secondärdateien ist in SQL Server 2025 (17.x) und der Azure SQL-Datenbank standardmäßig aktiviert .

Background

Bei lesbaren sekundären Replikaten können Statistiken auch automatisch erstellt werden, wenn die Option "Automatisches Erstellen von Statistiken " aktiviert ist, diese Statistiken sind jedoch temporär und verschwinden, wenn eine Instanz neu gestartet wird. Wenn Statistiken zu einer schreibgeschützten Datenbank oder einer schreibgeschützten Momentaufnahme fehlen oder veraltet sind, erstellt und verwaltet das Datenbankmodul temporäre Statistiken in tempdb.

Wenn das Datenbankmodul temporäre Statistiken erstellt, wird der Statistikname mit dem Suffix _readonly_database_statistic angefügt, um die temporären Statistiken von den permanenten Statistiken zu unterscheiden. Das Suffix _readonly_database_statistic ist für Statistiken reserviert, die von SQL Server generiert werden. Der Grund, warum dieser Ansatz ergriffen wurde, bestand darin, Arbeitslasten zu adressieren, die für lesbare sekundäre Replikate ausgeführt werden, die möglicherweise unterschiedliche Statistiken erfordern, die für das primäre Replikat nicht vorhanden sind.

Temporäre Statistiken, die auf sekundären Replikaten erstellt wurden, bleiben nur für das Replikat sichtbar, das sie generiert hat. Das primäre Replikat hat niemals direkten Zugriff auf diese temporären Statistikobjekte und erkennt das dauerhafte Statistikobjekt erst nach dem Speichern. Wenn temporäre Statistiken im primären Replikat beibehalten werden, werden sie über den Synchronisierungsmechanismus für alle Replikate in der Verfügbarkeitsgruppe verfügbar.

Der Persistenzmechanismus verwendet den Abfragespeicher für die Infrastruktur der lesbaren sekundären Replikate, die mit SQL Server 2022 (16.x) eingeführt wurde. Statistikinformationen werden an das primäre Replikat gesendet, in dem sie als permanente Statistiken beibehalten und dann mit allen sekundären Replikaten synchronisiert werden. Dieser Vorgang erfolgt automatisch, ohne dass ein manueller Eingriff erforderlich ist.

Unterstützung von Katalogansichten

Zur Unterstützung des Vergleichs der Statistikerstellung oder -aktualisierung zwischen sekundärer und primärer Daten und um zu verstehen, wo Statistiken erstellt wurden, wurden der Katalogansicht drei neue Spalten hinzugefügt sys.stats :

Spaltenname Datentyp Description
replica_role_id tinyint 1 = Primär, 2 = Sekundär, 3 = Geographische Sekundär, 4 = Geo HA Sekundär
replica_role_desc nvarchar(60) Primary, Sekundär, Geo-Sekundär, Geo HA-Sekundär
replica_name sysname Instanzname des Replikats in der Verfügbarkeitsgruppe. NULL für das primäre Replikat

Diese Spalten verfolgen den Besitz und den Ursprung von Statistiken während des gesamten Persistenzlebenszyklus. Wenn ein sekundäres Replikat temporäre Statistiken erstellt und in der primären Datei beibehalten wird, identifizieren die spalten replica_role_id und replica_name das ursprüngliche Replikat. Wenn diese permanenten Statistiken später auf der Primärinstanz aktualisiert werden, geht der Besitz auf die Primärinstanz über, was in diesen Spalten widergespiegelt wird.

Statistisches Persistenzverhalten

Wenn temporäre Statistiken von einem sekundären Replikat bis zum primären repliziert werden, treten mehrere wichtige Verhaltensweisen auf: Die temporären Statistiken für das sekundäre Replikat werden nach Persistenz nicht automatisch entfernt. Abfragen, die ursprünglich die Erstellung dieser temporären Statistiken ausgelöst haben, verwenden sie weiterhin, bis die Abfrage neu kompiliert wird oder das Replikat neu gestartet wird. Dies bedeutet, dass sowohl temporäre als auch permanente Versionen derselben Statistiken vorübergehend vorhanden sein können.

Der Optimierer berücksichtigt den Replikatbesitz nicht, wenn ermittelt wird, ob Statistiken verwendet werden sollen. Es wertet alle verfügbaren Statistiken basierend auf Spaltenabdeckung und Selektivitätsschätzungen aus. Die Replikatinformationen werden hauptsächlich für Nachverfolgungs- und Problembehandlungszwecke verwaltet.

Ein bemerkenswertes Szenario tritt auf, wenn permanente Statistiken, die aus temporären Statistiken erstellt wurden, veraltet werden. Wenn erhebliche Datenänderungen für die primär betroffenen Spalten in diesen Statistiken auftreten, kann die permanente Statistik als veraltet angesehen werden. Wenn Abfragen auf sekundäre Replikate auf diese Spalten verweisen, aktualisiert das sekundäre Replikat die Statistiken basierend auf seiner Ansicht der Daten und spiegelt die Änderungen wider, die über den Redo-Prozess angewendet wurden.

Kurz gesagt, die Persistenz entfernt nicht die Fähigkeit der sekundären, veralteten Statistiken zu aktualisieren; es fügt einfach einen Mechanismus hinzu, um Statistiken über Replikate hinweg zu teilen .

Observierbarkeit

Erweiterte Ereignisse

persisted_stats_operation (Operativer Kanal) wird für enqueued, dequeued, processedund failed Ereignisse ausgelöst. Dies kann hilfreich sein, um zu überwachen, ob eine Statistiknachricht nicht im primären System gespeichert werden kann oder ob Interesse daran besteht, die Nachrichtenverarbeitungsfunktion zu beobachten. Die temporären Statistiken verbleiben tempdb auf den sekundären Replikaten, während ein Hintergrundprozess erneut versucht, die Nachricht zu senden, wenn ein Kommunikationsproblem zwischen den primären und sekundären Replikaten vorliegt.

  • 9131: Feature beim Start von SQL deaktiviert.
  • 9136: Tabelle oder Index verworfen/geändert.
  • 9137: Das Schema wurde seit dem Start der Momentaufnahmetransaktion geändert; wiederholen.
  • 9139: Statistiken zu groß, um an den Primärspeicher zu senden.

Die folgende Abfrage kann Einblicke in die Statistiken einer Tabelle bieten, einschließlich Statistiken, die in sekundären Replikaten persistent gespeichert werden.

SELECT sch.[name] AS SchemaName,
       obj.[name] AS TableName,
       s.[name] AS StatsName,
       CASE WHEN s.stats_id >= 2 AND s.auto_created = 1 THEN 'AUTO_STATS'
            WHEN s.stats_id >= 2 AND s.auto_created = 0 THEN 'USER_CREATED_STATS'
            ELSE 'INDEX_STATS'
       END AS type,
       s.is_temporary,
       CASE WHEN s.replica_name IS NULL
                 AND s.replica_role_desc = 'PRIMARY'
                 AND s.stats_id >= 2
                 AND s.auto_created = 1
                 THEN 'PRIMARY'
            ELSE s.replica_name
       END AS replica_name,
       s.replica_role_id,
       s.replica_role_desc
FROM sys.schemas AS sch
     INNER JOIN sys.objects AS obj
         ON sch.schema_id = obj.schema_id
     INNER JOIN sys.stats AS s
         ON obj.object_id = s.object_id
WHERE sch.[name] <> 'sys'
ORDER BY sch.[name], obj.[name], s.stats_id;

Überlegungen

Die Funktion für beibehaltene Statistiken lesbarer Secondaries ist standardmäßig aktiviert, solange die Option Automatische Erstellung von Statistiken aktiviert ist und die Konfigurationsoptionen READABLE_SECONDARY_TEMPORARY_STATS_AUTO_CREATE und READABLE_SECONDARY_TEMPORARY_STATS_AUTO_UPDATE auf Datenbankebene aktiviert sind, was der Standardkonfiguration entspricht. Es gibt keine datenbankspezifische Konfiguration, um die Funktion ein- und auszuschalten.