SQL Server na prática

Diagnosticar columnstore do SQL Server por grupos de linhas

Analise estados, linhas excluídas e motivos de redução dos grupos antes de mudar cargas ou executar manutenção pesada em índices columnstore.

Um índice columnstore pode acelerar uma agregação grande e decepcionar em outra tabela com a mesma quantidade de linhas. A diferença costuma estar nos grupos físicos, nas colunas lidas e na capacidade dos filtros de eliminar trabalho. Conferir apenas a existência do índice não explica esses detalhes.

Columnstore é especialmente útil para ler poucas colunas sobre muitas linhas e agregá-las. Não substitui automaticamente um índice rowstore estreito para buscas seletivas. Comece pelo formato das consultas e pelas gravações, depois investigue a estrutura real.

Ler os grupos como evidência

Um grupo comprimido pode conter até 1.048.576 linhas. Novos registros podem passar primeiro por grupos delta em rowstore e ser comprimidos depois. A consulta de leitura examina uma tabela de fatos existente.

-- Replace dbo.FactSales with the table being investigated.
SELECT i.name AS IndexName, rg.partition_number, rg.row_group_id,
       rg.state_desc, rg.total_rows, rg.deleted_rows,
       CAST(100.0 * rg.deleted_rows / NULLIF(rg.total_rows, 0)
            AS decimal(6,2)) AS DeletedPercent,
       rg.size_in_bytes, rg.trim_reason_desc
FROM sys.dm_db_column_store_row_group_physical_stats AS rg
JOIN sys.indexes AS i
  ON i.object_id = rg.object_id AND i.index_id = rg.index_id
WHERE rg.object_id = OBJECT_ID(N'dbo.FactSales')
ORDER BY rg.index_id, rg.partition_number, rg.row_group_id;

OPEN e CLOSED indicam etapas do delta store; COMPRESSED contém dados colunares. Vários grupos abertos não significam defeito automaticamente, sobretudo com múltiplas partições ou fluxos de carga. Observe a evolução em vez de uma única fotografia.

Compare total de linhas, exclusões lógicas e motivos de redução. Muitas linhas excluídas podem gerar trabalho para entradas que não contribuem ao resultado. Um grupo pequeno pode refletir limite de memória, pressão de dicionário ou uma entrada reduzida. Um percentual NULL para grupo vazio evita uma divisão artificial.

A permissão depende da versão, como VIEW DATABASE STATE nas anteriores e VIEW DATABASE PERFORMANCE STATE a partir do SQL Server 2022. Utilize uma conexão de diagnóstico autorizada, sem ampliar desnecessariamente as permissões da aplicação.

Relacionar a estrutura à leitura

Considere uma agregação mensal por categoria.

-- Example report shape for an existing fact table.
SELECT ProductCategoryId, SUM(Revenue) AS Revenue
FROM dbo.FactSales
WHERE SaleDate >= '20260101' AND SaleDate < '20260201'
GROUP BY ProductCategoryId;

Columnstore pode deixar de ler colunas não usadas e pular segmentos cujos limites não atendem ao filtro de data. Essa eliminação é diferente de um seek em B-tree. Se cada grupo contém datas de toda a história, um mês específico ainda pode acessar muitos grupos.

Examine o plano real e os diagnósticos disponíveis sobre segmentos lidos. Compare linhas lidas e retornadas, agregação e derramamentos. A taxa de compressão não comprova que a consulta evitou trabalho. Executar em batch mode também não prova uma disposição eficiente.

Organização e carregamento influenciam os limites dos segmentos, mas uma consulta intermediária ordenada não garante sozinha a disposição física final. Confira os grupos resultantes e as leituras. Verifique ainda junções que multiplicam linhas antes da soma: o índice não corrige uma relação muitos para muitos incorreta.

Se o uso principal consulta algumas vendas individuais, um acesso rowstore complementar ou outro projeto pode ser melhor. Meça a combinação real, incluindo inserções e atualizações, em vez de extrapolar a partir de uma única soma favorável.

Corrigir a causa antes de reconstruir

Cargas bulk suficientemente grandes podem alimentar grupos comprimidos diretamente. O limiar de 102.400 linhas é importante no comportamento documentado. A quantidade efetiva recebida por cada partição importa. Dividir um arquivo grande entre muitas partições ou fluxos pode gerar grupos menores do que o total sugere.

Pequenas cargas frequentes e atualizações repetidas podem aumentar trabalho no delta store e nas exclusões. Agrupe ingestões quando a atualização exigida permitir. Por outro lado, forçar imediatamente a compressão de todo pequeno grupo aberto pode perpetuar grupos comprimidos pequenos. A manutenção precisa servir a um objetivo medido.

Escolha reorganização ou reconstrução depois de identificar índice, partições, benefício e custo. Reconstruir consome CPU, memória, log e espaço temporário enquanto concorre com relatórios. Fusões de fundo disponíveis em determinadas versões podem já melhorar algumas situações.

Registre antes e depois grupos, linhas úteis, leituras, duração e vazão de ingestão em períodos comparáveis. Uma melhoria precisa reduzir o esforço das consultas reais sem impedir que a alimentação cumpra seus próprios prazos.

Referências técnicas: Microsoft Learn: Columnstore overview · Microsoft Learn: Columnstore query performance · Microsoft Learn: Row group physical statistics.

Pergunte sobre este artigo

Tem alguma dúvida sobre este tema?

Conte o que você está avaliando ou onde encontrou dificuldades. Responderemos com uma recomendação prática.

Inquiries are not enabled in this preview.

Fazer uma pergunta sobre este artigo