Índices secundarios en Snowflake, ya en GA: varios caminos de acceso al dato sobre la misma tabla

Quien llega a Snowflake desde una base de datos relacional clásica suele hacer la misma pregunta en la primera semana: «¿Dónde creo los índices?». Durante años la respuesta ha sido: «aquí no hay índices; hay micro-particiones, pruning, claves de clustering y Search Optimization».

Esa respuesta funciona muy bien para cargas analíticas que recorren grandes volúmenes. Pero se queda corta cuando una misma tabla tiene que servir consultas muy selectivas por columnas distintas: buscar un cliente por su NIF, un pedido por su referencia, los movimientos de una cuenta en un rango de fechas… y todo sobre la misma tabla.

El 26 de octubre de 2026 Snowflake anunció la disponibilidad general (GA) de los índices secundarios sobre tablas estándar. En este artículo me centro en lo que más me interesa de esta novedad: cómo cambia la forma de acceder al dato.

El problema: una tabla, un único orden físico

En Snowflake, la eficiencia de una consulta selectiva depende de cuántas micro-particiones puede descartar el optimizador (pruning). Para eso usa los metadatos de mínimos y máximos de cada micro-partición.

Si la tabla está bien ordenada (de forma natural o con una clave de clustering) por la columna que filtras, el pruning es excelente. El problema es que una tabla solo puede tener un orden físico. Si la clusterizas por `fecha_pedido`, las búsquedas por `id_cliente` o por `referencia_externa` tienen que leer muchas más micro-particiones de las necesarias.

Hasta ahora, las alternativas eran:

– Elegir un patrón de acceso ganador y aceptar que los demás fueran más lentos.

– Duplicar la tabla (o crear vistas materializadas) con distinto orden para cada patrón.

– Search Optimization, muy útil para igualdades de alta cardinalidad y búsquedas de texto, pero sin soporte para expresiones ni capacidad de responder la consulta directamente.

Qué aporta un índice secundario

Un índice secundario relaciona los valores indexados con las micro-particiones que los contienen. Con eso, Snowflake puede saltarse todo el dato que la consulta no necesita, sin cambiar el orden físico de la tabla.

Estas son las mejoras clave para el acceso al dato:

1. Varios patrones de acceso sobre la misma tabla

Se pueden crear varios índices secundarios por tabla. La tabla sigue clusterizada para su patrón principal (normalmente el analítico) y cada índice añade un camino de acceso eficiente para otro patrón. Es lo que más cambia en el diseño: ya no hay que elegir un único patrón de acceso por tabla.

SQL
-- Patrón principal: análisis por fecha (clave de clustering)
ALTER TABLE pedidos CLUSTER BY (fecha_pedido);
-- Patrones adicionales: búsquedas puntuales por otras columnas
CREATE INDEX idx_pedidos_cliente ON pedidos (id_cliente, fecha_pedido);
CREATE INDEX idx_pedidos_referencia ON pedidos (referencia_externa);
2. Búsquedas puntuales y por rango

Los índices secundarios aceleran búsquedas puntuales muy selectivas y consultas por rango. Según la documentación, admiten predicados de igualdad, desigualdad, rango y listas `IN`. Esto los diferencia de Search Optimization, pensado sobre todo para igualdades de alta cardinalidad y funciones de texto o geoespaciales.

SQL
SELECT *
FROM pedidos
WHERE id_cliente = 48213
AND fecha_pedido BETWEEN '2026-01-01' AND '2026-03-31';
3. Índices multicolumna: el orden importa

La clave de un índice es una lista ordenada de columnas o expresiones, y Snowflake usa ese orden al podar micro-particiones con predicados multicolumna. Las primeras expresiones suelen podar mejor. La documentación recomienda:

– Poner primero la columna de filtro más selectiva.

– Usar índices multicolumna cuando las columnas solo son selectivas en combinación.

4. Índices sobre expresiones

La clave puede ser una expresión escalar determinista, no solo una columna. Si tus consultas filtran por `UPPER(email)` o por un `CAST`, puedes indexar exactamente esa expresión:

SQL
CREATE INDEX idx_clientes_email ON clientes (UPPER(email));
SELECT id_cliente, nombre
FROM clientes
WHERE UPPER(email) = 'ANA.GARCIA@EJEMPLO.COM';

Es especialmente útil cuando el mínimo y el máximo de la expresión no se pueden deducir de los de la columna original, porque en ese caso el pruning estándar no ayuda.

5. Índices de cobertura con `INCLUDE`

Esta es, para mí, la mejora más interesante a nivel de acceso. Con `INCLUDE` se guardan en el índice columnas adicionales que no sirven para podar, pero que permiten responder la consulta directamente desde el índice, sin leer la tabla base. Es lo que se conoce como índice de cobertura (covering index).

SQL
CREATE INDEX idx_pedidos_ref_cov
ON pedidos (referencia_externa)
INCLUDE (estado, importe_total);
-- Puede resolverse solo con el índice
SELECT estado, importe_total
FROM pedidos
WHERE referencia_externa = 'PO-2026-000871';

Si la consulta necesita columnas que no están en el índice, no pasa nada: el optimizador sigue usándolo para podar micro-particiones de la tabla base. La regla práctica es: columnas filtradas en la clave, columnas devueltas en `INCLUDE`.

6. Transparente para quien consulta

El índice no se referencia por su nombre en las consultas. El optimizador reescribe la consulta automáticamente, y Snowflake mantiene el índice de forma automática cuando cambian los datos. Para los consumidores (aplicaciones, herramientas de BI, APIs) no cambia nada: el SQL es el mismo y el acceso es más rápido.

Cómo encaja con lo que ya existía

Índice secundarioSearch OptimizationClústering automático
PredicadosIgualdad, desigualdad, rango, INIgualdad de alta cardinalidad, IN, funciones de texto y geoespacialesPruning por rango e igualdad
ExpresionesColumnas y expresiones escalares deterministasSolo columnasColumnas y expresiones de la clave
Responde desde la propia estructuraSí, con índice de coberturaNoSí, porque ordena la tabla base
FacturaciónSearch OptimizationSearch OptimizationClustering automático

Mi forma de verlo: el clustering define el patrón de acceso principal, los índices secundarios añaden patrones selectivos y Search Optimization cubre búsquedas de texto, geoespaciales y de alta cardinalidad. No compiten; se complementan.

Ojo: no deben confundirse con los índices de las hybrid tables, que son una funcionalidad distinta.

Lo que hay que saber antes de usarlos

Los índices secundarios no son una solución mágica. Estas limitaciones afectan directamente al acceso al dato:

– Un solo índice por tabla en cada escaneo. El optimizador elige el de mayor beneficio esperado y no combina índices. Diseña pensando en el patrón más importante de cada consulta.

– No están garantizados. El optimizador puede decidir no usar un índice aunque pudiera ayudar.

– No se usan en consultas con Time Travel.

– No se admiten en tablas o columnas con políticas de acceso a filas, enmascaramiento, agregación o privacidad. Es la restricción más relevante para el gobierno del dato: en tablas con datos sensibles protegidas por políticas, de momento no hay índices.

– No disponibles en tablas Iceberg, vistas ni vistas materializadas. Solo en tablas estándar.

– No se replican (la documentación lo describe como una limitación temporal).

– Se eliminan automáticamente si se elimina o renombra una columna referenciada o si cambia su tipo de dato.

– Requieren Enterprise Edition o superior y un rol con `OWNERSHIP` sobre la tabla y `ADD SEARCH OPTIMIZATION` sobre el esquema.

Y el coste

El mantenimiento de los índices se factura como parte de Search Optimization. Para hacer seguimiento de los créditos de cada índice se puede consultar la vista `SEARCH_OPTIMIZATION_HISTORY` y filtrar por `INDEX_TYPE = ‘Secondary Index’`.

Dos recomendaciones desde FinOps:

– Mantén las listas de `INCLUDE` cortas. Cada columna adicional aumenta el coste del índice.

– Mide antes y después. Un índice compensa cuando la consulta se ejecuta con frecuencia y es muy selectiva. Para consultas puntuales o poco selectivas, probablemente no.

Conclusión

Para mí, esta GA es un paso importante en una tendencia clara: Snowflake ya no es solo un motor para escanear mucho dato bien, sino también para encontrar poco dato muy rápido. Junto con las hybrid tables y Search Optimization, los índices secundarios acercan la plataforma a escenarios que antes empujaban a llevar los datos a otra base de datos: APIs de datos, aplicaciones que consultan registros concretos, portales de clientes o soporte operativo.

Desde el punto de vista de arquitectura, cambia una decisión de diseño de fondo: ya no hay que elegir un único patrón de acceso por tabla ni duplicar datos para servir varios. Eso significa menos copias, menos pipelines y menos riesgo de que dos versiones del mismo dato se desalineen.

Queda pendiente, eso sí, que puedan convivir con las políticas de enmascaramiento y acceso a filas. Hasta entonces, en tablas con datos sensibles habrá que buscar otras vías.

Podéis leer la nota oficial en la documentación de Snowflake y todos los detalles en la guía de índices secundarios.

¿Tenéis tablas en las que habéis acabado duplicando datos para servir distintos patrones de acceso? Me encantará leer vuestros casos en los comentarios.

Foto de portada gracias a Markus Winkler: https://www.pexels.com/es-es/foto/espacio-para-texto-copy-space-lupa-aumentar-4144768/

Publicado por alb3rtoalonso

Soy un enamorado del poder de los datos. Entusiasta de la mejora y formación continua.

Deja una respuesta