Snowflake
Snowflake 시퀀스 생성기
Snowflake 시퀀스는 ETL 변환이 아니라 데이터베이스 객체입니다. 웨어하우스가 생성 ID를 소유해야 할 때 유용합니다.
사용 시점
- 키 생성이 데이터베이스 계층의 책임일 때 `CREATE SEQUENCE`를 사용합니다.
- 새 행에 고유한 숫자 ID가 필요할 때 INSERT, MERGE, 기본값 표현식에서 `NEXTVAL`을 호출합니다.
- 키 범위를 명확히 관리하기 위해 키 도메인마다 시퀀스를 하나씩 두는 것이 좋습니다.
주요 구문
| 구문 | 용도 | 예시 |
|---|---|---|
| CREATE SEQUENCE | 시퀀스 객체를 정의합니다. | CREATE SEQUENCE customer_seq START = 1 INCREMENT = 1; |
| NEXTVAL | 다음 값으로 전진해 반환합니다. | customer_seq.NEXTVAL |
| ALTER SEQUENCE | 나중에 동작을 조정합니다. | ALTER SEQUENCE customer_seq SET INCREMENT = 10; |
웨어하우스 소유 키 흐름
- 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를 반환).
관련 링크