[Snowflake] Sequences

차지예·2026년 5월 7일

Snowflake

목록 보기
10/49
post-thumbnail

1. Sequence란?

A sequence is a schema-level object that generates unique, incrementing numeric values automatically.
Sequence는 고유하고 증가하는 숫자 값을 자동으로 생성하는 스키마 레벨 객체다.

  • 스키마 레벨 객체(Schema-level object)다 — 데이터베이스/스키마에 종속됨
  • 여러 세션(session) 및 동시 실행 쿼리(concurrent statements)에서도 전역적으로 고유한(globally unique) 값을 생성
  • 주로 Primary Key 또는 고유 값이 필요한 컬럼에 사용

2. Sequence 생성 문법

CREATE SEQUENCE <sequence_name>
  START = <start_value>
  INCREMENT = <increment_value>;

예시 1 — 기본 Sequence

CREATE SEQUENCE DEFAULT_SEQUENCE
  START = 1
  INCREMENT = 1;
호출 순서NEXTVAL 결과
1번째 SELECT DEFAULT_SEQUENCE.NEXTVAL1
2번째 SELECT DEFAULT_SEQUENCE.NEXTVAL2
3번째 SELECT DEFAULT_SEQUENCE.NEXTVAL3

예시 2 — 증가값(INCREMENT) 지정

CREATE SEQUENCE INCREMENT_SEQUENCE
  START = 0
  INCREMENT = 5;

단일 쿼리에서 NEXTVAL을 여러 번 참조하면:

SELECT INCREMENT_SEQUENCE.NEXTVAL,
       INCREMENT_SEQUENCE.NEXTVAL,
       INCREMENT_SEQUENCE.NEXTVAL,
       INCREMENT_SEQUENCE.NEXTVAL;
NEXTVALNEXTVAL_1NEXTVAL_2NEXTVAL_3
35404550

📌 결과값이 35부터 시작하는 것은 강의 시연 중 이미 여러 번 NEXTVAL을 호출한 누적 상태이기 때문.
START = 0, INCREMENT = 5 기준으로 8번째 호출 시 35가 반환됨.
처음부터 35를 반환하려면 START = 35로 지정하면 됨.


3. NEXTVAL 핵심 특징

특징설명
전역 고유성동시 쿼리에서도 같은 값이 절대 반환되지 않음
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!

4. Sequence 활용 패턴 2가지

패턴 ① — INSERT 시 직접 사용

CREATE SEQUENCE TRANSACTION_SEQ
  START = 1001
  INCREMENT = 1;

INSERT INTO TRANSACTION (ID)
VALUES (TRANSACTION_SEQ.NEXTVAL);

SELECT ID FROM TRANSACTION;
-- 결과: ID = 1001

패턴 ② — 테이블 컬럼 DEFAULT 값으로 사용

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가 자동 할당)

5. ORDER / NOORDER 옵션

공식 문서에 따르면, Sequence 생성 시 ORDER 또는 NOORDER를 지정할 수 있음.

옵션설명
ORDER이전 statement보다 큰 값을 순서대로 생성 보장
NOORDER값의 순서를 보장하지 않음. 동시 INSERT 성능 향상 목적

6. 관련 DDL 명령어

-- 조회
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."


7. 포인트 요약 ✅

번호핵심 포인트
1Sequence는 Schema-level object
2📌 생성된 값은 globally unique (전역 고유)
3📌 값의 연속성(gap-free)은 보장하지 않음
4단일 쿼리에서 NEXTVAL 복수 참조 시 각각 다른 값 반환
5CURRVAL은 Snowflake에서 지원하지 않음
6테이블 컬럼의 DEFAULT 값으로 사용 가능
7START 값은 생성 후 변경 불가, INCREMENT는 ALTER로 변경 가능
8NOORDER 옵션은 동시 INSERT 성능 향상에 유리

참고 문서: Using Sequences — Snowflake Documentation | CREATE SEQUENCE

0개의 댓글