Snowflake
Snowflake シーケンスジェネレーター
Snowflake のシーケンスは ETL 変換ではなくデータベースオブジェクトです。DWH が生成 ID を管理すべき場合に役立ちます。
使いどころ
- キー生成がデータベース層の責務である場合は `CREATE SEQUENCE` を使う。
- 新しい行に一意の数値 ID が必要なときは、INSERT、MERGE、デフォルト式で `NEXTVAL` を呼び出す。
- キー範囲を把握しやすくするため、キーのドメインごとに 1 つのシーケンスを使う。
重要構文
| 構文 | 用途 | 例 |
|---|---|---|
| CREATE SEQUENCE | シーケンスオブジェクトを定義する。 | CREATE SEQUENCE customer_seq START = 1 INCREMENT = 1; |
| NEXTVAL | 進捗して次の値を返す。 | customer_seq.NEXTVAL |
| ALTER SEQUENCE | 後から挙動を調整する。 | ALTER SEQUENCE customer_seq SET INCREMENT = 10; |
DWH 管理のキーフロー
- 1ターゲットテーブルを所有するスキーマにシーケンスオブジェクトを作成する。
- 2INSERT または MERGE 文の中で `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;FAQ
シーケンス値に欠番があるのはなぜ?
欠番は正常。完全な連番よりも一意性が重要。
ETL と Snowflake の両方でキーを生成すべき?
すべきではない。サロゲートキーのライフサイクルはどちらか一方が管理しないと、モデルが崩れる。
Snowflake のシーケンスを主キーのデフォルトにできる?
できる。シーケンスの NEXTVAL を列のデフォルト値に設定する:`ALTER TABLE t ALTER COLUMN id SET DEFAULT seq.NEXTVAL`。これにより、すべての INSERT のキー生成がデータベース層に移る。
ターゲットテーブルを TRUNCATE した後にシーケンスをリセットするには?
`ALTER SEQUENCE seq_name SET VALUE = 0` で初期値にリセットする。次の NEXTVAL は START 値(SET VALUE が START より大きい場合は START + INCREMENT)を返す。
関連リンク