Guía completa de las funciones AISQL de Snowflake (IA en SQL)
Introducción a Snowflake AISQL Snowflake ha incorporado funciones nativas de IA en SQL (AISQL) que permiten realizar tareas de inteligencia artificial directamente dentro de consultas…
En el mundo del almacenamiento de datos en la nube, la eficiencia y el rendimiento son esenciales. Snowflake, una plataforma líder en almacenamiento de datos, se destaca por su arquitectura única y optimizada, en la cual las micro-particiones juegan un papel fundamental.
En este artículo exploraremos en profundidad qué son las micro-particiones, cómo se almacenan los datos dentro de ellas, qué metadatos genera Snowflake de forma automática y cómo todo esto impacta directamente en el rendimiento de tus consultas.
En esencia, las micro-particiones son unidades contiguas de almacenamiento que Snowflake utiliza para organizar los datos de las tablas. Todas las tablas en Snowflake se dividen automáticamente en estas unidades.
Cada micro-partición contiene entre 50 MB y 500 MB de datos sin comprimir. Snowflake comprime los datos antes de almacenarlos utilizando algoritmos optimizados por columna, lo que reduce significativamente el tamaño real en disco.
INSERT, UPDATE, DELETE, MERGE) genera nuevas micro-particiones en lugar de alterar las existentes.Snowflake almacena automáticamente metadatos enriquecidos para cada micro-partición, incluyendo:
Estos metadatos son la pieza clave que permite a Snowflake decidir qué micro-particiones necesita leer y cuáles puede ignorar por completo.
TRUNCATE TABLE, Snowflake solo necesita actualizar los metadatos sin recorrer los datos físicos.Dado que las micro-particiones son inmutables, cada operación DML tiene un comportamiento específico que es importante comprender:
Cuando se insertan nuevas filas, Snowflake crea nuevas micro-particiones para almacenar los datos insertados. Las micro-particiones existentes no se modifican.
-- Al insertar datos, Snowflake crea nuevas micro-particiones automáticamente
INSERT INTO clientes (id, nombre, fecha_registro, ciudad)
VALUES
(1001, 'Ana García', '2024-03-15', 'Madrid'),
(1002, 'Carlos López', '2024-03-16', 'Barcelona');
Las operaciones UPDATE y DELETE no modifican las micro-particiones originales. En su lugar, Snowflake:
-- Esta operación no modifica la micro-partición original
-- Snowflake crea una nueva micro-partición sin las filas eliminadas
DELETE FROM clientes
WHERE fecha_registro < '2023-01-01';
Cuando se elimina una columna de una tabla con ALTER TABLE ... DROP COLUMN, Snowflake no reescribe las micro-particiones de forma inmediata. La columna simplemente se excluye de los metadatos y deja de ser accesible, pero los datos físicos se mantienen hasta que las micro-particiones se recreen por otras operaciones.
La poda (pruning) es el proceso mediante el cual Snowflake utiliza los metadatos de las micro-particiones para eliminar de la lectura aquellas que no contienen datos relevantes para una consulta. Este es uno de los mecanismos más importantes para el rendimiento en Snowflake.
Cuando ejecutas una consulta con un filtro WHERE, Snowflake consulta los metadatos (rangos mínimo/máximo de cada columna por micro-partición) y determina cuáles micro-particiones podrían contener filas que coincidan con el filtro. Las que no pueden contener resultados se descartan antes de leer cualquier dato.
Imagine una tabla llamada CLIENTES con información sobre clientes, organizada por fecha de registro:
CREATE TABLE clientes (
id INT,
nombre VARCHAR(100),
fecha_registro DATE,
ciudad VARCHAR(50),
plan VARCHAR(20)
);
Supongamos que la tabla tiene millones de filas distribuidas en cientos de micro-particiones. Cada micro-partición almacena los metadatos del rango de fecha_registro que contiene. Si ejecutamos:
SELECT nombre, ciudad
FROM clientes
WHERE fecha_registro = '2024-03-15';
Snowflake consulta los metadatos y determina que solo 3 de 200 micro-particiones contienen filas con fecha_registro en un rango que incluye '2024-03-15'. Las otras 197 micro-particiones se podan y nunca se leen del almacenamiento. Esto reduce drásticamente el volumen de datos escaneados y el tiempo de ejecución.
Puedes verificar la efectividad de la poda revisando el Query Profile en la interfaz de Snowflake. En la sección del operador TableScan, encontrarás dos métricas clave:
Una consulta bien optimizada debería mostrar un número de Partitions scanned significativamente menor que Partitions total.
El clustering (agrupamiento) de datos se refiere a cómo están organizados los datos dentro de las micro-particiones de una tabla. Cuando los datos están bien agrupados, las filas con valores similares en determinadas columnas tienden a estar almacenadas en las mismas micro-particiones (o en un conjunto reducido de ellas).
Por defecto, Snowflake agrupa los datos en las micro-particiones según el orden de inserción. Si los datos se cargan ordenados cronológicamente, la columna de fecha tendrá un clustering natural excelente: cada micro-partición contendrá un rango de fechas estrecho y no habrá mucha superposición entre particiones.
Sin embargo, si los datos se insertan de forma desordenada o si las consultas filtran frecuentemente por columnas que no coinciden con el orden de inserción, el clustering natural puede no ser eficiente.
Para tablas grandes (generalmente del orden de terabytes) donde el clustering natural no es suficiente, Snowflake permite definir claves de clustering en una o más columnas.
Se puede definir la clave de clustering al momento de crear la tabla:
-- Definir clustering key al crear la tabla
CREATE TABLE eventos (
evento_id STRING,
evento_fecha TIMESTAMP_NTZ,
usuario_id STRING,
region STRING,
payload VARIANT
)
CLUSTER BY (evento_fecha);
O bien, aplicarla sobre una tabla existente:
-- Definir una clave de clustering en la columna fecha_registro
ALTER TABLE clientes CLUSTER BY (fecha_registro);
-- Clustering por múltiples columnas
ALTER TABLE clientes CLUSTER BY (ciudad, fecha_registro);
Al definir una clave de clustering, Snowflake activa el servicio de Automatic Clustering en segundo plano, que reorganiza periódicamente los datos en las micro-particiones para mantener un buen agrupamiento según las columnas definidas.
Definir una clave de clustering no siempre es la decisión correcta. Es importante evaluar si el beneficio justifica el coste.
Usarlo cuando:
No usarlo cuando:
Cuando se define una clave de clustering en una tabla, Snowflake puede mantener el agrupamiento de datos de forma automática mediante el servicio de Automatic Clustering.
Ventajas:
Desventajas:
Antes de definir una clave de clustering, es recomendable analizar el historial de consultas para identificar patrones de filtrado frecuentes:
-- Identificar las consultas que más datos escanean
SELECT query_text,
COUNT(*) AS ejecuciones,
AVG(bytes_scanned) AS promedio_bytes_escaneados
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE database_name = 'MI_BASE_DE_DATOS'
GROUP BY query_text
ORDER BY promedio_bytes_escaneados DESC
LIMIT 20;
En los resultados, busca:
WHERE o JOIN.Esta información te permitirá tomar una decisión informada sobre qué columnas son las mejores candidatas para una clave de clustering.
La profundidad de clustering es la métrica que Snowflake utiliza para medir qué tan bien agrupados están los datos en una tabla con respecto a una o más columnas. Se define como el promedio de solapamiento de micro-particiones para los valores de las columnas especificadas.
Snowflake proporciona funciones del sistema para consultar la información de clustering de una tabla:
-- Obtener la profundidad de clustering para una columna específica
SELECT SYSTEM$CLUSTERING_DEPTH('clientes', '(fecha_registro)');
-- Obtener información detallada de clustering
SELECT SYSTEM$CLUSTERING_INFORMATION('clientes', '(fecha_registro)');
La función SYSTEM$CLUSTERING_INFORMATION devuelve un objeto JSON con información detallada, incluyendo:
cluster_by_keys: Las columnas evaluadas.total_partition_count: Número total de micro-particiones.total_constant_partition_count: Micro-particiones donde la columna de clustering tiene un solo valor distinto (clustering ideal).average_overlaps: Promedio de micro-particiones que se solapan para cada valor. Un valor menor indica mejor clustering.average_depth: Profundidad promedio de clustering.Un ejemplo de la salida:
{
"cluster_by_keys": "LINEAR(fecha_registro)",
"total_partition_count": 200,
"total_constant_partition_count": 45,
"average_overlaps": 3.5,
"average_depth": 4.2
}
En este ejemplo, una profundidad promedio de 4.2 significa que, en promedio, un valor de fecha_registro está presente en aproximadamente 4 micro-particiones. Si esta cifra fuera cercana a 1, la poda sería extremadamente eficiente.
Las micro-particiones son la base de varias características avanzadas de la plataforma:
Como se detalló anteriormente, Snowflake puede ignorar las micro-particiones que no son relevantes para una consulta, lo que acelera significativamente el procesamiento. La poda es automática y se basa por completo en los metadatos.
Gracias a la inmutabilidad de las micro-particiones, Snowflake puede acceder a versiones anteriores de los datos. Cuando una operación DML modifica datos, las micro-particiones originales se marcan como «eliminadas» pero no se borran físicamente del almacenamiento durante el período de retención configurado (1 a 90 días).
-- Consultar los datos de la tabla tal como estaban hace 30 minutos
SELECT *
FROM clientes
AT (OFFSET => -60 * 30);
-- Consultar los datos en un punto específico en el tiempo
SELECT *
FROM clientes
AT (TIMESTAMP => '2024-03-15 10:00:00'::TIMESTAMP_LTZ);
La clonación de tablas, esquemas o bases de datos en Snowflake se basa en la referencia a las micro-particiones existentes. Al crear un clon, Snowflake no duplica físicamente los datos; simplemente crea nuevos metadatos que apuntan a las mismas micro-particiones. Solo cuando se modifican datos en el clon o en el original se crean nuevas micro-particiones independientes.
-- Crear un clon de la tabla sin duplicar datos físicamente
CREATE TABLE clientes_backup CLONE clientes;
Este mecanismo permite crear copias instantáneas de tablas de terabytes sin consumir almacenamiento adicional.
SYSTEM$CLUSTERING_INFORMATION y revisa el Query Profile antes de definir o cambiar una clave de clustering.bytes_scanned antes y después para confirmar que el cambio tiene impacto.WHERE y JOIN.CLUSTER BY siempre mejora el rendimiento: Sin un análisis previo, el clustering puede no aportar mejora visible o incluso ser contraproducente en tablas donde el pruning ya es eficiente.bytes_scanned y tiempos de ejecución, no hay forma de saber si el clustering está funcionando.Las micro-particiones son una pieza fundamental de la arquitectura de Snowflake y la clave para su eficiencia y rendimiento. Su naturaleza inmutable, su formato columnar, y los metadatos enriquecidos que Snowflake genera automáticamente permiten optimizaciones como la poda de particiones, Time Travel y la clonación sin costo.
Al comprender cómo funcionan las micro-particiones, cómo impactan en las operaciones DML y cómo el clustering de datos mejora la eficiencia de la poda, puedes aprovechar al máximo las capacidades de optimización de Snowflake y garantizar un procesamiento rápido y eficiente de tus datos.
La clave es medir, entender el patrón de consultas y tomar decisiones basadas en datos. Para tablas grandes donde el rendimiento no es el esperado, evalúa la profundidad de clustering con SYSTEM$CLUSTERING_INFORMATION, analiza el historial de consultas en QUERY_HISTORY, y si es necesario, define claves de clustering en las columnas más utilizadas en tus filtros.