Compartilhar via


Estatísticas persistentes para secundários legíveis

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

O Query Store para secundários legíveis está disponível no SQL Server 2025 (17.x) e no Banco de Dados SQL do Azure, e as estatísticas persistentes para o recurso de secundários legíveis utilizam a infraestrutura que o Query Store já oferece para secundários legíveis.

O Repositório de Consultas para secundários legíveis está ativado por padrão no SQL Server 2025 (17.x) e no Banco de Dados SQL do Azure.

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á habilitada, mas essas estatísticas são temporárias e desaparecem quando uma instância é reiniciada. Quando as estatísticas de um banco de dados somente leitura ou de um instantâneo somente leitura estão ausentes ou obsoletas, o Mecanismo de Banco de Dados cria e mantém estatísticas temporárias em 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 tomada 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árias e só está ciente do objeto de estatísticas permanentes após a persistência. Quando as estatísticas temporárias são mantidas na 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 em que elas são mantidas como estatísticas permanentes e, em seguida, sincronizadas de volta para todas as réplicas secundárias. Esse processo ocorre automaticamente sem a necessidade de intervenção manual.

Modos de exibição de catálogo de suporte

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

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

Essas colunas acompanham a propriedade e a origem das estatísticas ao longo de todo o ciclo de vida de persistência. Quando uma réplica secundária cria estatísticas temporárias e elas são mantidas no primário, as colunas replica_role_id e replica_name identificam a réplica de origem. Se essas estatísticas permanentes forem atualizadas no futuro na réplica primária, a propriedade será transferida para a réplica primária, e isso será refletido nessas colunas.

Comportamento de persistência de estatísticas

Quando as estatísticas temporárias são mantidas de uma réplica secundária para a primária, 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 dispararam a criação dessas estatísticas temporárias continuam a usá-las até que a consulta passe por recompilação ou a réplica seja reiniciada. Isso significa que as versões temporárias e 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. Ele avalia todas as estatísticas disponíveis com base nas estimativas de cobertura de coluna e seletividade. As informações da réplica são mantidas principalmente para fins de acompanhamento e solução de problemas.

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

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

Observability

Eventos Estendidos

persisted_stats_operation(Canal operacional) é ativado para eventos de enqueued, dequeued, processed e failed. Isso pode ser útil para monitorar se uma mensagem de estatísticas não puder ser mantida no primário ou se houver interesse em acompanhar a funcionalidade de processamento de mensagens. As estatísticas temporárias permanecem em tempdb nas 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 instantâneo foi iniciada; Repetir.
  • 9139: Estatísticas grandes demais para serem enviadas para o servidor primário.

A consulta a seguir pode fornecer alguma visibilidade das estatísticas em uma tabela, incluindo estatísticas persistidas de 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

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