Condividi tramite


Statistiche persistenti per secondari leggibili

Si applica a: SQL Server 2025 (17.x) Azure SQL Database

Query Store per repliche secondarie leggibili è disponibile in SQL Server 2025 (17.x) e nel database SQL di Azure e le statistiche persistenti per le repliche secondarie leggibili usano l'infrastruttura usata da Query Store per repliche secondarie leggibili.

Query Store per repliche secondarie leggibili è attivo per impostazione predefinita in SQL Server 2025 (17.x) e nel database SQL di Azure.

Background

Nelle repliche secondarie leggibili, le statistiche possono essere create automaticamente anche quando l'opzione di creazione automatica delle statistiche è abilitata, ma tali statistiche sono temporanee e scompaiono quando viene riavviata un'istanza. Quando le statistiche su uno snapshot o un database di sola lettura sono mancanti o non aggiornate, il motore di database crea e gestisce statistiche temporanee in tempdb.

Quando il motore di database crea statistiche temporanee, il nome delle statistiche viene aggiunto con il suffisso _readonly_database_statistic per distinguere le statistiche temporanee dalle statistiche permanenti. Il suffisso _readonly_database_statistic è riservato per le statistiche generate da SQL Server. Il motivo per cui questo approccio è stato adottato è quello di gestire i carichi di lavoro eseguiti su repliche secondarie leggibili che potrebbero richiedere statistiche distinte che non esistono nella replica primaria.

Le statistiche temporanee create nelle repliche secondarie rimangono visibili solo alla replica che le ha generate. La replica primaria non accede mai direttamente a questi oggetti statistiche temporanei ed è a conoscenza solo dell'oggetto statistiche permanente dopo la persistenza. Quando le statistiche temporanee vengono mantenute nella replica primaria, diventano disponibili per tutte le repliche nel gruppo di disponibilità tramite il meccanismo di sincronizzazione.

Il meccanismo di persistenza usa Query Store per l'infrastruttura secondaria leggibile introdotta in SQL Server 2022 (16.x). Le informazioni sulle statistiche vengono inviate alla replica primaria in cui vengono mantenute come statistiche permanenti, quindi sincronizzate con tutte le repliche secondarie. Questo processo viene eseguito automaticamente senza richiedere l'intervento manuale.

Sostenere le viste del catalogo

Per supportare il confronto tra la creazione o l'aggiornamento delle statistiche tra secondario e primario e per facilitare la comprensione della posizione in cui sono state create le statistiche, sono state aggiunte tre nuove colonne alla vista del sys.stats catalogo:

Nome della colonna Tipo di dati Description
replica_role_id tinyint 1 = Primario, 2 = Secondario, 3 = Geo Secondario, 4 = Geo HA Secondario
replica_role_desc nvarchar(60) Primario, Secondario, Secondario Geografico, HA Secondario Geografico
replica_name sysname Nome dell'istanza della replica nel gruppo di disponibilità. NULL per la replica primaria

Queste colonne tengono traccia della proprietà e dell'origine delle statistiche durante il ciclo di vita della persistenza. Quando una replica secondaria crea statistiche temporanee e vengono mantenute nel database primario, le colonne replica_role_id e replica_name identificano la replica di origine. Se queste statistiche permanenti vengono aggiornate successivamente nella replica primaria, la proprietà viene trasferita alla replica primaria, che si riflette in queste colonne.

Comportamento di persistenza delle statistiche

Quando le statistiche temporanee vengono mantenute da una replica secondaria a quella primaria, si verificano diversi comportamenti importanti: le statistiche temporanee nella replica secondaria non vengono rimosse automaticamente dopo la persistenza. Le query che hanno originariamente attivato la creazione di queste statistiche temporanee continuano a usarle fino a quando la query non viene sottoposta a ricompilazione o la replica viene riavviata. Ciò significa che le versioni temporanee e permanenti delle stesse statistiche possono coesistere temporaneamente.

L'ottimizzatore non considera la proprietà della replica quando determina se utilizzare le statistiche. Valuta tutte le statistiche disponibili in base alla copertura delle colonne e alle stime di selettività. Le informazioni sulla replica vengono mantenute principalmente a scopo di rilevamento e risoluzione dei problemi.

Uno scenario rilevante si verifica quando le statistiche permanenti create da statistiche temporanee diventano non aggiornate. Se si verificano modifiche significative ai dati sulle colonne principali che influiscono su tali statistiche, le statistiche permanenti potrebbero essere considerate obsolete. Quando le query sulle repliche secondarie fanno riferimento a queste colonne, la replica secondaria aggiorna le statistiche in base alla sua visualizzazione dei dati, riflettendo le modifiche applicate tramite il processo di redo.

In breve, la persistenza non rimuove la capacità di aggiornare le statistiche obsolete; aggiunge semplicemente un meccanismo per condividere le statistiche tra le repliche.

Observability

Eventi estesi

persisted_stats_operation (Canale operativo) viene generato per enqueued, dequeued, processed e failed eventi. Ciò può essere utile per monitorare se un messaggio di statistiche non può essere salvato in modo permanente nel database primario o se si è interessati a controllare la funzionalità di elaborazione dei messaggi. Le statistiche temporanee rimangono in tempdb sulle repliche secondarie mentre un processo in background tenta di inviare nuovamente il messaggio se si riscontra un problema di comunicazione tra le repliche primarie e secondarie.

  • 9131: funzionalità disabilitata durante l'avvio di SQL.
  • 9136: tabella o indice eliminato/modificato.
  • 9137: Lo schema è cambiato dall'inizio della transazione snapshot; riprova.
  • 9139: Statistiche troppo grandi da inviare al primario.

La query seguente può fornire una certa visibilità sulle statistiche in una tabella, incluse le statistiche persistenti dalle repliche secondarie:

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;

Considerazioni

Le statistiche persistenti per le repliche secondarie leggibili sono abilitate per impostazione predefinita, purché l'opzione di creazione automatica delle statistiche sia abilitata e che le READABLE_SECONDARY_TEMPORARY_STATS_AUTO_CREATEREADABLE_SECONDARY_TEMPORARY_STATS_AUTO_UPDATE opzioni di configurazione con ambito database siano abilitate, ovvero la configurazione predefinita. Non esiste alcuna configurazione con ambito database per attivare e disattivare la funzionalità.