Partilhar via


Estatísticas persistentes para secundários legíveis

Aplica-se a: SQL Server 2025 (17.x) Azure SQL Database

A Query Store para secundários legíveis está disponível no SQL Server 2025 (17.x) e no Azure SQL Database, e a funcionalidade de estatísticas persistentes para secundários legíveis utiliza a infraestrutura que a Query Store tem para secundários legíveis.

A Query Store para secundários legíveis está ativada por defeito no SQL Server 2025 (17.x) e na Azure SQL Database.

Background

Em réplicas secundárias legíveis, as estatísticas também podem ser criadas automaticamente quando a opção de criação automática de estatísticas está ativada, mas essas estatísticas são temporárias e desaparecem quando uma instância é reiniciada. Quando as estatísticas numa base de dados de leitura apenas ou cópia instantânea de leitura apenas estão ausentes ou obsoletas, o Mecanismo de Base de Dados cria e mantém estatísticas temporárias no tempdb.

Quando o Mecanismo de Banco de Dados cria estatísticas temporárias, o nome das estatísticas é acrescentado com o sufixo _readonly_database_statistic para diferenciar as estatísticas temporárias das estatísticas permanentes. O sufixo _readonly_database_statistic é reservado para estatísticas geradas pelo SQL Server. O motivo pelo qual essa abordagem foi adotada foi para abordar cargas de trabalho que são executadas em réplicas secundárias legíveis que podem exigir estatísticas distintas que não existem na réplica primária.

As estatísticas temporárias criadas em réplicas secundárias permanecem visíveis apenas para a réplica que as gerou. A réplica primária nunca acessa diretamente esses objetos de estatísticas temporários e só está ciente do objeto de estatísticas permanentes após a persistência. Quando as estatísticas temporárias são persistidas para a réplica primária, elas ficam disponíveis para todas as réplicas no grupo de disponibilidade por meio do mecanismo de sincronização.

O mecanismo de persistência usa o Repositório de Consultas para infraestrutura secundária legível introduzida no SQL Server 2022 (16.x). As informações de estatísticas são enviadas para a réplica primária, onde são mantidas como estatísticas permanentes, e depois sincronizadas de volta para todas as réplicas secundárias. Este processo ocorre automaticamente sem necessidade de intervenção manual.

Visualizações do catálogo de suporte

Para dar suporte à comparação da criação ou atualização de estatísticas entre a base de dados secundária e a primária e para ajudar a entender onde as estatísticas foram criadas, três novas colunas foram adicionadas à exibição do catálogo sys.stats.

Nome da coluna Tipo de dados Description
replica_role_id tinyint 1 = Primário, 2 = Secundário, 3 = Geo Secundário, 4 = Geo HA Secundário
replica_role_desc nvarchar(60) Primário, Secundário, Secundário Geo, Secundário Geo HA
replica_name sysname Nome da instância da réplica no grupo de disponibilidade. NULL para a réplica primária

Essas colunas rastreiam a propriedade e a origem das estatísticas ao longo do ciclo de vida da persistência. Quando uma réplica secundária cria estatísticas temporárias e elas persistem para a principal, as colunas replica_role_id e replica_name identificam a réplica de origem. Se essas estatísticas permanentes forem atualizadas posteriormente na réplica primária, a propriedade será transferida para a primária, o que é refletido nessas colunas.

Comportamento de persistência de estatísticas

Quando as estatísticas temporárias são persistidas de uma réplica secundária para a principal, vários comportamentos importantes ocorrem: As estatísticas temporárias na réplica secundária não são removidas automaticamente após a persistência. As consultas que originalmente acionaram a criação dessas estatísticas temporárias continuam a usá-las até que a consulta passe por uma recompilação ou a réplica seja reiniciada. Isto significa que tanto as versões temporárias como as permanentes das mesmas estatísticas podem coexistir temporariamente.

O otimizador não considera a propriedade da réplica ao determinar se deve usar estatísticas. Avalia todas as estatísticas disponíveis com base na cobertura de colunas e estimativas de seletividade. As informações da réplica são mantidas principalmente para fins de rastreamento e solução de problemas.

Um cenário notável ocorre quando as estatísticas permanentes criadas a partir de estatísticas temporárias se tornam obsoletas. Se ocorrerem modificações significativas nos dados das colunas primárias nas estatísticas, as estatísticas permanentes podem ser consideradas obsoletas. Quando consultas nas réplicas secundárias fazem referência a essas colunas, a secundária atualiza as estatísticas de dados com base na sua visão dos dados, refletindo as modificações que foram aplicadas através do processo de redo.

Em suma, a persistência não elimina a capacidade do secundário de atualizar estatísticas obsoletas; ele simplesmente adiciona um mecanismo para compartilhar estatísticas entre réplicas.

Observability

Eventos Prolongados

persisted_stats_operation (Canal operacional) é ativado para enqueued, dequeued, processed e failed os eventos. Isso pode ser útil para monitorizar se uma mensagem de estatísticas não pode ser armazenada no servidor primário ou se há interesse em observar o processo de processamento de mensagens. As estatísticas temporárias permanecem nas tempdb réplicas secundárias enquanto um processo em segundo plano tenta enviar a mensagem novamente se houver um problema de comunicação entre as réplicas primária e secundária.

  • 9131: Recurso desabilitado durante a inicialização do SQL.
  • 9136: Tabela ou índice descartado/modificado.
  • 9137: Esquema alterado desde que a transação de snapshot começou; tentar novamente.
  • 9139: Estatísticas muito grandes para enviar para o servidor primário.

A consulta a seguir pode fornecer alguns detalhes sobre as estatísticas de uma tabela, incluindo as estatísticas persistentes das réplicas secundárias.

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;

Considerações

O recurso de estatísticas persistentes para secundários legíveis é habilitado por padrão, desde que a opção de criação automática de estatísticas esteja habilitada e as READABLE_SECONDARY_TEMPORARY_STATS_AUTO_CREATE opções de configuração com escopo de banco de dados estejam READABLE_SECONDARY_TEMPORARY_STATS_AUTO_UPDATE habilitadas, que é a configuração padrão. Não há nenhuma configuração de escopo de banco de dados para ativar e desativar o recurso.