Snowflake
Generador de Secuencias de Snowflake
Las secuencias de Snowflake son objetos de base de datos, no transformaciones ETL. Son útiles cuando el warehouse debe ser dueño de los IDs generados.
Cuándo usarlo
- Usa `CREATE SEQUENCE` cuando la generación de claves pertenezca a la capa de base de datos.
- Llama a `NEXTVAL` en INSERTs, MERGEs o expresiones por defecto cuando las filas nuevas necesiten IDs numéricos únicos.
- Mejor una secuencia por dominio de clave para que los rangos de IDs sean fáciles de razonar.
Sintaxis importante
| Sintaxis | Propósito | Ejemplo |
|---|---|---|
| CREATE SEQUENCE | Define el objeto de secuencia. | CREATE SEQUENCE customer_seq START = 1 INCREMENT = 1; |
| NEXTVAL | Avanza y devuelve el siguiente valor. | customer_seq.NEXTVAL |
| ALTER SEQUENCE | Ajusta el comportamiento más adelante. | ALTER SEQUENCE customer_seq SET INCREMENT = 10; |
Flujo de clave gestionada por el warehouse
- 1Crea el objeto de secuencia en el esquema dueño de la tabla destino.
- 2Referencia `sequence_name.NEXTVAL` dentro de la sentencia INSERT o MERGE.
- 3Verifica que el ETL posterior no genere también una clave competidora.
- 4Documenta la propiedad de la secuencia para mantener alineadas las cargas y el DDL.
Código
Crear y usar una secuencia
CREATE OR REPLACE SEQUENCE customer_seq START = 1 INCREMENT = 1;
INSERT INTO dim_customer (customer_key, customer_name)
SELECT customer_seq.NEXTVAL, customer_name
FROM stg_customer;FAQ
¿Por qué hay huecos en los valores de la secuencia?
Los huecos son normales. La unicidad importa más que una numeración perfectamente continua.
¿Deben ETL y Snowflake generar claves a la vez?
No. Elige un único dueño del ciclo de vida de la clave subrogada o el modelo se desalineará.
¿Puedo usar una secuencia de Snowflake como valor por defecto de una clave primaria?
Sí. Asigna NEXTVAL de la secuencia como valor por defecto de la columna: `ALTER TABLE t ALTER COLUMN id SET DEFAULT seq.NEXTVAL`. Así la generación de claves pasa a la capa de base de datos para todas las inserciones.
¿Cómo reinicio una secuencia tras truncar la tabla destino?
Usa `ALTER SEQUENCE seq_name SET VALUE = 0` para volver al valor inicial. La siguiente llamada a NEXTVAL devolverá el valor START (o START + INCREMENT si SET VALUE queda por encima).
Relacionado