ハブに戻る
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. 1ターゲットテーブルを所有するスキーマにシーケンスオブジェクトを作成する。
  2. 2INSERT または MERGE 文の中で `sequence_name.NEXTVAL` を参照する。
  3. 3下流の ETL が競合するキーを同時に生成していないことを確認する。
  4. 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)を返す。

関連リンク