Guia de arquitectura

Indices columnstore en SQL Server: guia practica

Columnstore puede transformar cargas analiticas grandes, pero no reemplaza universalmente el diseño rowstore. La pregunta util no es si columnstore es moderno. La pregunta util es si la tabla y los patrones de acceso justifican sus tradeoffs.

Por que columnstore se siente como una caja negra

Muchos equipos conocen columnstore por benchmarks o por un proyecto exitoso de data warehouse y luego lo generalizan demasiado. Columnstore es excelente para comprimir grandes datasets y escanear muchas filas rapido en analitica. Es bastante menos atractivo para lookups puntuales, accesos OLTP estrechos o tablas pequenas que nunca alcanzan escala suficiente para beneficiarse del formato.

Punto importante: un clustered columnstore puede reemplazar el layout clustered rowstore en algunas tablas orientadas a analitica, pero la clave primaria aun puede requerir un indice rowstore nonclustered.

Ejemplos de diseno con columnstore

Estos ejemplos muestran la diferencia practica entre usar columnstore clustered y nonclustered, ademas del chequeo DMV necesario tras cargar datos.

Crear un indice clustered columnstore en una tabla fact

sql

Este es el patron clasico de warehouse cuando scans y agregaciones dominan la carga.

CREATE TABLE dbo.FactSales
(
    SalesKey bigint NOT NULL,
    OrderDateKey int NOT NULL,
    CustomerKey int NOT NULL,
    ProductKey int NOT NULL,
    Quantity int NOT NULL,
    NetAmount decimal(18,2) NOT NULL
);

CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSales
ON dbo.FactSales;

Agregar un indice nonclustered columnstore a una tabla rowstore

sql

Este patron sirve cuando el acceso OLTP sigue dependiendo de rowstore, pero el reporting se beneficia de una proyeccion analitica comprimida.

CREATE TABLE dbo.SalesOrderDetail
(
    SalesOrderDetailID bigint NOT NULL PRIMARY KEY,
    SalesOrderID bigint NOT NULL,
    ProductID int NOT NULL,
    OrderQty int NOT NULL,
    UnitPrice money NOT NULL,
    ModifiedDate datetime2 NOT NULL
);

CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrderDetail_Analytics
ON dbo.SalesOrderDetail (SalesOrderID, ProductID, OrderQty, UnitPrice, ModifiedDate);

Revisar la salud de los rowgroups tras la carga

sql

El exito de columnstore depende de la calidad de los rowgroups, no solo de que el indice exista.

SELECT
    OBJECT_NAME(object_id) AS table_name,
    row_group_id,
    state_desc,
    total_rows,
    deleted_rows,
    size_in_bytes / 1024.0 / 1024.0 AS size_mb
FROM sys.dm_db_column_store_row_group_physical_stats
WHERE object_id = OBJECT_ID('dbo.FactSales')
ORDER BY row_group_id;

Donde encaja cada modelo de indexacion

Clustered columnstore

Ideal para tablas tipo fact grandes dominadas por scans, agregaciones y cargas analiticas sensibles a la compresion donde el acceso transaccional fila a fila no es el camino principal.

Nonclustered columnstore

Util cuando una tabla aun necesita comportamiento rowstore para el acceso transaccional principal, pero las consultas analiticas pueden beneficiarse de una proyeccion comprimida adicional.

Rowstore tradicional

Sigue siendo la opcion por defecto correcta para muchas tablas OLTP que dependen de predicados selectivos, singleton lookups, updates frecuentes o latencia transaccional consistente.

Patrones de diseño practicos

Tablas fact orientadas a analitica

  • - Considere clustered columnstore cuando dominen scans y agregaciones
  • - Alinee cargas y particiones con el movimiento y la retencion de datos
  • - Mida calidad de rowgroups y compresion tras cargas reales, no solo en staging

Tablas mixtas operacionales y de reporting

  • - Mantenga rowstore como camino principal cuando los lookups transaccionales sigan siendo criticos
  • - Agregue nonclustered columnstore de forma selectiva para acelerar reporting
  • - Valide overhead de escritura e impacto de mantenimiento antes de ampliar el diseño

Planificacion de ciclo de vida y mantenimiento

  • - Revise particionamiento, tamanos de lote y archivado en conjunto
  • - Confirme que la estrategia de indices siga soportando constraints y consultas operativas
  • - Trate columnstore como parte del diseño de tabla y no como un simple toggle de tuning

Errores comunes con columnstore

Usar columnstore en tablas pequeñas

Si la tabla es demasiado pequena, el motor apenas obtiene ventajas de compresion y scan. La complejidad aumenta y el beneficio sigue siendo marginal.

Olvidar los paths de acceso puntuales

Una tabla que sirve lookups calientes o seeks muy selectivos suele seguir necesitando un diseño rowstore-first, incluso si tambien existen consultas de reporting.

Ignorar los patrones de carga

Tamanos de lote pobres, movimiento de particiones incomodo o patrones de escritura intensivos pueden degradar los rowgroups y borrar la mejora esperada.

Trate columnstore como una decision de workload

Columnstore es poderoso cuando la tabla se comporta como un activo analitico: muchas filas, valor de compresion, scans grandes y consultas centradas en agregaciones. No es automaticamente mejor por ser mas nuevo o porque un benchmark lo favorecio.

El diseño correcto comienza con los patrones de acceso, no con categorias de marketing. Si la mayoria de las consultas son transaccionales y selectivas, rowstore sigue siendo la opcion mas segura. Si la tabla se comporta como una fact table, columnstore merece una evaluacion seria.

FAQ

Cuando debo usar un clustered columnstore en SQL Server?

Suele ser mas fuerte en tablas analiticas o de warehouse grandes donde dominan scans y agregaciones y los lookups transaccionales no son el workload principal.

Puede un indice columnstore reemplazar un clustered index de clave primaria?

Un clustered columnstore puede reemplazar el layout clustered rowstore en algunas tablas, pero el enforcement de la clave primaria aun puede requerir un indice rowstore nonclustered.

Es columnstore mejor que rowstore para OLTP?

Por lo general no como regla global. Rowstore tradicional sigue siendo la mejor opcion por defecto para muchas tablas OLTP por sus lookups selectivos, updates frecuentes y patrones transaccionales predecibles.

© 2026 - Ryware.