Diagnosticar registros encaminhados em heaps SQL Server
Meça movimentos de linhas em heaps e relacione-os a leituras e latência antes de escolher reconstrução ou mudança no desenho da tabela.
Um heap pode servir bem para dados temporários e mudar de comportamento após meses de updates. Quando uma linha variável cresce, a página original pode ficar sem espaço. O SQL Server pode movê-la e deixar um encaminhamento no local anterior.
Reproduzir crescimento em uma tabela de teste
Um heap não possui índice clustered, mas pode ter nonclustered. O exemplo define a chave primária explicitamente como nonclustered para não mudar a estrutura sem querer. Use uma base de prática onde o nome esteja livre.
CREATE TABLE dbo.HeapForwardDemo
(
RowId int NOT NULL PRIMARY KEY NONCLUSTERED,
Payload varchar(1000) NOT NULL
);
;WITH N AS
(
SELECT TOP (10000)
CONVERT(int, ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS n
FROM sys.all_objects AS a CROSS JOIN sys.all_objects AS b
)
INSERT dbo.HeapForwardDemo (RowId, Payload)
SELECT n, REPLICATE('a', 100) FROM N;
UPDATE dbo.HeapForwardDemo
SET Payload = REPLICATE('b', 900)
WHERE RowId % 2 = 0;
O conteúdo inicial é curto; depois metade das linhas cresce bastante. A quantidade exata de encaminhamentos depende de posicionamento e espaço disponível. Meça em vez de esperar um percentual fixo.
SELECT
index_id, partition_number, alloc_unit_type_desc,
page_count, record_count,
forwarded_record_count,
avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats
(
DB_ID(), OBJECT_ID(N'dbo.HeapForwardDemo'), 0, NULL, 'DETAILED'
)
WHERE alloc_unit_type_desc = 'IN_ROW_DATA';
A inspeção mira apenas um heap em modo DETAILED. A coleta física pode fazer muita E/S e precisa de permissões adequadas. Não troque o filtro por NULL em uma produção grande para obter um relatório aparentemente completo.
forwarded_record_count evidencia movimento. page_count e ocupação média das páginas descrevem o restante do layout. Uma métrica NULL em modo menos detalhado não significa zero. Guarde modo, partição e unidade de alocação com o resultado.
Relacionar layout ao trabalho observado
Índices nonclustered de um heap usam localizadores que podem levar ao ponto original e depois à linha movida. A navegação extra pode aumentar trabalho, mas sua contagem não mede diretamente a latência. Caminho de acesso, cache e frequência de leitura influenciam o impacto.
Identifique consultas afetadas e registre leituras lógicas, CPU, duração e planos reais com parâmetros representativos. Compare cargas semelhantes. Se as linhas também ficaram nove vezes maiores, mais páginas e menor densidade explicam parte da mudança independentemente dos encaminhamentos.
Um índice cobrindo uma consulta pode evitar buscar alguns dados no heap, mas adiciona armazenamento e manutenção de escrita. Outras consultas continuam acessando a base. Escolha índices por padrões úteis, não para esconder uma questão de armazenamento sem diagnóstico.
Diferencie encaminhamento e fragmentação lógica de um B-tree. Uma rotina baseada apenas em avg_fragmentation_in_percent pode ignorar o problema relevante. Heaps exigem interpretação específica e evidências ligadas à carga.
Escolher conforme o ciclo da tabela
Reconstruir o heap pode remover encaminhamentos existentes, mas não impede novos após expansões futuras. Estes comandos afetam somente o objeto de prática. Rode a inspeção novamente após reconstruir e antes de remover.
ALTER TABLE dbo.HeapForwardDemo REBUILD;
-- Run the inspection query again before removing the test table.
DROP TABLE dbo.HeapForwardDemo;
Na produção, planeje duração, capacidade do log, espaço, locks e efeitos nos índices nonclustered. Reconstruir somente um desses índices não reorganiza as linhas base. Um limite arbitrário de encaminhamentos não justifica sozinho uma manutenção grande.
Um clustered bem escolhido pode servir a uma tabela persistente com acessos por chave e updates frequentes. Ele muda localizadores e traz custos de divisão de páginas e largura da chave. Escolha uma chave estável conforme o trabalho.
Para staging carregado, processado e descartado, manter heap pode ser apropriado. A manutenção acompanha o ciclo do lote. Para linhas persistentes que crescem, investigue se a expansão posterior é necessária ou consequência do fluxo de gravação.
Relacione a medição posterior às consultas e à recorrência. Se encaminhamentos voltam rapidamente e a latência pouco muda, reconstruções frequentes tratam um sintoma. Guarde também tempo desde a carga e volume de alterações. A estratégia passa a refletir o ciclo real da tabela, em vez de uma porcentagem isolada de manutenção.
Referências técnicas: Microsoft Learn: Heaps · Microsoft Learn: Index physical statistics · Microsoft Learn: ALTER TABLE.