SQL Server en la práctica

Diagnosticar columnstore de SQL Server por grupos de filas

Examina estados, filas eliminadas y motivos de recorte para mejorar columnstore antes de cambiar cargas o programar reconstrucciones costosas.

Un índice columnstore puede acelerar una agregación y decepcionar en otra tabla con igual número de filas. La diferencia suele estar en los grupos físicos, las columnas leídas y la capacidad de evitar trabajo mediante predicados. Mirar únicamente si el índice existe deja fuera esas causas.

Columnstore resulta especialmente útil al leer pocas columnas sobre muchas filas para agregar. No sustituye automáticamente un índice rowstore estrecho destinado a búsquedas selectivas. Empieza por la forma de las consultas y la carga de escritura, y después examina la estructura física.

Leer la evidencia de los grupos

Un grupo comprimido puede contener hasta 1.048.576 filas. Las nuevas filas pueden entrar primero en grupos delta rowstore y comprimirse posteriormente. La consulta de solo lectura inspecciona una tabla de hechos 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 y CLOSED representan etapas del almacén delta; COMPRESSED contiene datos columnares. Varios grupos abiertos no son necesariamente un defecto, sobre todo con distintas particiones o flujos de carga. Observa tendencias en lugar de una instantánea aislada.

Compara filas totales, eliminadas y motivos de recorte. Muchas eliminaciones lógicas pueden obligar a procesar entradas que ya no aportan resultados. Un grupo pequeño puede reflejar límites de memoria, presión de diccionario o entradas reducidas. Un porcentaje NULL para un grupo vacío evita inventar una división válida.

Los permisos dependen de la versión: VIEW DATABASE STATE en versiones anteriores y VIEW DATABASE PERFORMANCE STATE desde SQL Server 2022. Utiliza una conexión de diagnóstico autorizada sin ampliar innecesariamente permisos de la aplicación.

Relacionar estructura y consulta

Considera una agregación mensual por categoría.

-- 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 puede evitar columnas innecesarias y omitir segmentos cuyos límites no satisfacen el filtro de fecha. Esa eliminación no equivale a un seek de B-tree. Si cada grupo contiene fechas de toda la historia, un mes concreto todavía puede tocar muchos grupos.

Revisa el plan real y los diagnósticos disponibles de segmentos leídos. Compara filas leídas y devueltas, agregación y derrames. Una buena compresión no demuestra que la consulta evitó trabajo. Tampoco ejecutar en modo batch confirma una distribución física adecuada.

La disposición y las cargas influyen en los límites de segmentos, pero ordenar una consulta intermedia no garantiza por sí solo la disposición final. Comprueba los grupos resultantes y las lecturas. Revisa también uniones que multiplican filas antes de agregar: un índice no corrige una relación muchos a muchos mal planteada.

Si predominan consultas de unas pocas ventas individuales, considera un acceso rowstore complementario u otro diseño. Mide el conjunto real de lecturas y escrituras, no extrapoles desde una única suma analítica favorable.

Corregir causas antes de reconstruir

Cargas bulk suficientemente grandes pueden alimentar directamente grupos comprimidos. Las 102.400 filas son un umbral importante del comportamiento documentado. Importa el lote efectivo recibido por cada partición. Dividir un archivo grande entre muchas particiones o flujos puede generar grupos mucho menores de lo esperado.

Cargas diminutas frecuentes y actualizaciones repetidas pueden aumentar trabajo delta y de filas eliminadas. Agrupa la ingestión cuando la frescura lo permita. En cambio, forzar la compresión inmediata de cada pequeño grupo abierto puede crear grupos comprimidos persistentemente pequeños. El mantenimiento debe responder a un objetivo medido.

Elige reorganizar o reconstruir después de identificar índice, particiones, beneficio y coste. Una reconstrucción consume CPU, memoria, registro y espacio temporal mientras compite con informes. Algunas versiones incorporan fusiones de fondo que ya pueden mejorar ciertas condiciones.

Registra antes y después cantidades de grupos, filas útiles, lecturas, duración e ingestión usando periodos comparables. Una mejora debe reducir trabajo de consultas reales sin impedir que la carga cumpla sus propios plazos.

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

Pregunta sobre este artículo

¿Tiene alguna pregunta sobre este tema?

Cuéntenos qué está evaluando o dónde tiene dificultades. Le responderemos con una recomendación práctica.

Inquiries are not enabled in this preview.

Hacer una pregunta sobre este artículo