Snowflake
Snowflake 数列生成器
Snowflake 序列是数据库对象,而非 ETL 转换。当数仓应拥有生成 ID 时很有用。
使用时机
- 当键生成属于数据库层时,使用 `CREATE SEQUENCE`。
- 新行需要唯一数字 ID 时,在插入、合并或默认表达式中调用 `NEXTVAL`。
- 每个键域使用一个序列,ID 区间更易管理。
重要语法
| 语法 | 用途 | 示例 |
|---|---|---|
| CREATE SEQUENCE | 定义序列对象。 | CREATE SEQUENCE customer_seq START = 1 INCREMENT = 1; |
| NEXTVAL | 推进并返回下一个值。 | customer_seq.NEXTVAL |
| ALTER SEQUENCE | 之后调整行为。 | ALTER SEQUENCE customer_seq SET INCREMENT = 10; |
数仓自有键流程
- 1在拥有目标表的 schema 中创建序列对象。
- 2在插入或合并语句中引用 `sequence_name.NEXTVAL`。
- 3验证下游 ETL 不会同时生成竞争键。
- 4记录序列归属,使加载与 DDL 保持一致。
代码
创建并使用序列
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;常见问题
序列值为什么有空洞?
空洞是正常的。唯一性比完美连续编号更重要。
ETL 与 Snowflake 都应该生成键吗?
不应该。为代理键生命周期选择一个归属方,否则模型会漂移。
可以把 Snowflake 序列作为主键默认值吗?
可以。将序列 NEXTVAL 设为列默认值:`ALTER TABLE t ALTER COLUMN id SET DEFAULT seq.NEXTVAL`。这样所有插入操作的键生成都移到数据库层。
截断目标表后如何重置序列?
使用 `ALTER SEQUENCE seq_name SET VALUE = 0` 重置为初始值。下一次 NEXTVAL 返回 START 值(若 SET VALUE 高于它,则返回 START + INCREMENT)。
相关链接