A sequence is a schema-level object that generates unique, incrementing numeric values automatically.
Sequence는 고유하고 증가하는 숫자 값을 자동으로 생성하는 스키마 레벨 객체다.
CREATE SEQUENCE <sequence_name>
START = <start_value>
INCREMENT = <increment_value>;
CREATE SEQUENCE DEFAULT_SEQUENCE
START = 1
INCREMENT = 1;
| 호출 순서 | NEXTVAL 결과 |
|---|---|
1번째 SELECT DEFAULT_SEQUENCE.NEXTVAL | 1 |
2번째 SELECT DEFAULT_SEQUENCE.NEXTVAL | 2 |
3번째 SELECT DEFAULT_SEQUENCE.NEXTVAL | 3 |
CREATE SEQUENCE INCREMENT_SEQUENCE
START = 0
INCREMENT = 5;
단일 쿼리에서 NEXTVAL을 여러 번 참조하면:
SELECT INCREMENT_SEQUENCE.NEXTVAL,
INCREMENT_SEQUENCE.NEXTVAL,
INCREMENT_SEQUENCE.NEXTVAL,
INCREMENT_SEQUENCE.NEXTVAL;
| NEXTVAL | NEXTVAL_1 | NEXTVAL_2 | NEXTVAL_3 |
|---|---|---|---|
| 35 | 40 | 45 | 50 |
📌 결과값이 35부터 시작하는 것은 강의 시연 중 이미 여러 번 NEXTVAL을 호출한 누적 상태이기 때문.
START = 0, INCREMENT = 5 기준으로 8번째 호출 시 35가 반환됨.
처음부터 35를 반환하려면 START = 35로 지정하면 됨.
| 특징 | 설명 |
|---|---|
| 전역 고유성 | 동시 쿼리에서도 같은 값이 절대 반환되지 않음 |
| Gap 발생 가능 | 연속된 값을 보장하지 않음 |
| 단일 쿼리 내 복수 참조 | 같은 쿼리에서 NEXTVAL을 여러 번 쓰면 각각 다른 값 반환 |
| CURRVAL 미지원 | Snowflake는 CURRVAL을 지원하지 않음 |
📌
"Snowflake does not guarantee generating sequence numbers without gaps. The generated numbers are not necessarily contiguous."
Snowflake는 gap(공백) 없이 연속된 시퀀스 번호 생성을 보장하지 않는다. 생성된 숫자들이 반드시 연속적일 필요는 없다.-- INCREMENT = 1 이어도 내부적으로 예를 들어 -- 노드 A가 1~20 예약 -- 노드 B가 21~40 예약 노드 A가 1, 2, 3 사용하다가 → 갑자기 쿼리 취소 노드 B가 21, 22, 23 사용 → 실제 저장된 값: 1, 2, 3, 21, 22, 23 ... → 4~20이 통째로 gap!
CREATE SEQUENCE TRANSACTION_SEQ
START = 1001
INCREMENT = 1;
INSERT INTO TRANSACTION (ID)
VALUES (TRANSACTION_SEQ.NEXTVAL);
SELECT ID FROM TRANSACTION;
-- 결과: ID = 1001
CREATE TABLE TRANSACTIONS (
ID INTEGER DEFAULT TRANSACTION_SEQ.NEXTVAL,
AMOUNT DOUBLE
);
INSERT INTO TRANSACTION (AMOUNT) VALUES (756.00);
SELECT ID FROM TRANSACTION;
-- 결과: ID = 1002, AMOUNT = 756.00
-- (ID를 명시하지 않아도 Sequence가 자동 할당)
공식 문서에 따르면, Sequence 생성 시 ORDER 또는 NOORDER를 지정할 수 있음.
| 옵션 | 설명 |
|---|---|
ORDER | 이전 statement보다 큰 값을 순서대로 생성 보장 |
NOORDER | 값의 순서를 보장하지 않음. 동시 INSERT 성능 향상 목적 |
-- 조회
SHOW SEQUENCES;
DESCRIBE SEQUENCE <name>;
-- 수정 (INCREMENT만 변경 가능)
ALTER SEQUENCE <name> SET INCREMENT = <new_value>;
-- 삭제
DROP SEQUENCE <name>;
⚠️ START 값(초기값)은 생성 후 변경 불가
"The first/initial value for a sequence cannot be changed after the sequence is created."
| 번호 | 핵심 포인트 |
|---|---|
| 1 | Sequence는 Schema-level object다 |
| 2 | 📌 생성된 값은 globally unique (전역 고유) |
| 3 | 📌 값의 연속성(gap-free)은 보장하지 않음 |
| 4 | 단일 쿼리에서 NEXTVAL 복수 참조 시 각각 다른 값 반환 |
| 5 | CURRVAL은 Snowflake에서 지원하지 않음 |
| 6 | 테이블 컬럼의 DEFAULT 값으로 사용 가능 |
| 7 | START 값은 생성 후 변경 불가, INCREMENT는 ALTER로 변경 가능 |
| 8 | NOORDER 옵션은 동시 INSERT 성능 향상에 유리 |
참고 문서: Using Sequences — Snowflake Documentation | CREATE SEQUENCE