Snowflake
Snowflake Sequence Generator
As sequências do Snowflake são objetos de banco de dados, não transformações ETL. São úteis quando o data warehouse deve ser dono dos IDs gerados.
Quando usar
- Use `CREATE SEQUENCE` quando a geração de chaves pertence à camada de banco de dados.
- Chame `NEXTVAL` em inserções, merges ou expressões default quando novas linhas precisarem de IDs numéricos únicos.
- Prefira uma sequência por domínio de chave para manter as faixas de ID fáceis de entender.
Sintaxe importante
| Sintaxe | Finalidade | Exemplo |
|---|---|---|
| CREATE SEQUENCE | Define o objeto sequence. | CREATE SEQUENCE customer_seq START = 1 INCREMENT = 1; |
| NEXTVAL | Avança e retorna o próximo valor. | customer_seq.NEXTVAL |
| ALTER SEQUENCE | Ajusta o comportamento depois. | ALTER SEQUENCE customer_seq SET INCREMENT = 10; |
Fluxo de chave pertencente ao warehouse
- 1Crie o objeto sequence no schema que é dono da tabela de destino.
- 2Referencie `sequence_name.NEXTVAL` dentro da instrução INSERT ou MERGE.
- 3Valide que o ETL a jusante também não está gerando uma chave concorrente.
- 4Documente o dono da sequence para manter cargas e DDL alinhados.
Código
Criar e usar uma sequence
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;Perguntas frequentes
Por que há lacunas nos valores da sequência?
Lacunas são normais. A unicidade importa mais do que uma numeração perfeitamente contígua.
O ETL e o Snowflake devem gerar chaves ao mesmo tempo?
Não. Escolha um único dono para o ciclo de vida da chave surrogate, ou o modelo vai se desalinhar.
Posso usar uma sequência do Snowflake como default de chave primária?
Sim. Atribua o NEXTVAL da sequência como valor default da coluna: `ALTER TABLE t ALTER COLUMN id SET DEFAULT seq.NEXTVAL`. Isso move a geração de chaves para a camada de banco em todas as operações de INSERT.
Como redefinir uma sequência após truncar a tabela de destino?
Use `ALTER SEQUENCE seq_name SET VALUE = 0` para voltar ao valor inicial. A próxima chamada de NEXTVAL retorna o valor de START (ou START + INCREMENT, se SET VALUE estiver acima).
Relacionados