[Snowflake] Table Sampling

차지예·2026년 6월 11일

Snowflake

목록 보기
40/49
post-thumbnail

🎯 큰 그림: "아이스크림 시식"

전체 통(테이블)을 다 먹어볼 순 없으니,
무작위로 한 스푼 떠서 맛보는 것 = Table Sampling

SAMPLE이랑 TABLESAMPLE이름만 다른 쌍둥이 🍼 (완전히 같음)


1️⃣ 떠내는 방법 2가지

🟡 BERNOULLI (= ROW) — "알갱이 하나하나 동전 던지기"

사탕 한 알 한 알을 집을지 말지 동전을 던져 결정
→ 50%면 사탕마다 앞면 나온 것만 골라 담기

SELECT * FROM LINEITEM SAMPLE BERNOULLI (50);  -- 각 행마다 50% 확률

🔵 SYSTEM (= BLOCK) — "상자 단위로 동전 던지기"

사탕을 한 알씩이 아니라 박스(블록) 통째로 가져갈지 동전 던지기
→ 빠르지만, 박스가 몇 개 없으면 결과가 들쭉날쭉(편향) 🎲

SELECT * FROM LINEITEM SAMPLE SYSTEM (50);  -- 각 블록마다 50% 확률

💡 박스(block) = 보통 micro-partition 한 개
💡 아무것도 안 적으면 기본은 BERNOULLI (한 알씩 던지기)

방식비유속도정확도
BERNOULLI / ROW알갱이마다 동전느림균일
SYSTEM / BLOCK박스마다 동전빠름작은 테이블선 편향

2️⃣ 얼마나 떠낼까? 2가지 기준

🟢 Fraction-based — "퍼센트로 떠내기"

"전체의 50%만 줘" → 통 크기에 따라 양이 달라짐 (대략치)

SELECT * FROM LINEITEM SAMPLE (50);   -- 약 절반 (정확히 절반은 아님!)
  • 숫자 범위: 0 ~ 100 (퍼센트 확률)

🔵 Fixed-size — "딱 N개만 떠내기"

"정확히 3알만 줘" → 통이 충분히 크면 칼같이 3개 반환
통에 3개도 없으면? → 있는 거 전부 다 줌

SELECT L_TAX, L_SHIPMODE FROM LINEITEM SAMPLE BERNOULLI (3 ROWS);
  • 숫자 범위: 0 ~ 1,000,000 (정수 개수)

3️⃣ ⚠️ Fixed-size의 "출입 금지" 규칙 ( ⭐⭐⭐)

"딱 N개(ROWS)" 모드에선 → 박스(SYSTEM/BLOCK)도, 도장(SEED)도 못 들어옴!
억지로 넣으면 → 에러 🚫

-- ❌ 박스 단위로 "정확히 10개" → 모순이라 에러
SELECT * FROM example_table SAMPLE SYSTEM (10 ROWS);

-- ❌ "정확히 10개"에 도장(SEED) → 에러
SELECT * FROM example_table SAMPLE ROW (10 ROWS) SEED (99);
조합가능?
한 알씩(ROW) + N개
박스(BLOCK) + N개❌ 에러
N개 + 도장(SEED)❌ 에러

🧠 비유: "정확히 3알 줘"라고 했는데 "박스째로 무작위"는 말이 안 됨 →❌


4️⃣ SEED (= REPEATABLE) — "똑같이 재현하는 도장"

매번 다른 한 스푼이 나오는데, 도장(SEED)을 찍으면 항상 똑같은 스푼
→ 같은 테이블 + 같은 도장 + 같은 확률 = 언제나 같은 결과 (재현 가능)

SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);

📍 중요: 도장(SEED)은 박스 방식(SYSTEM/BLOCK)에서만 찍을 수 있음
📍 view나 subquery 위에는 도장 못 찍음 (에러)

  • 도장 안 찍으면 → 돌릴 때마다 다른 결과 (그리고 더 빠름)

5️⃣ 동의어 쌍둥이 4쌍

그룹쌍둥이
명령어SAMPLE = TABLESAMPLE
알갱이BERNOULLI = ROW
박스SYSTEM = BLOCK
도장REPEATABLE = SEED

6️⃣ JOIN 떠내기 주의

조인한 결과를 한꺼번에 떠내고 싶으면 →
반드시 서브쿼리로 감싸서(통에 다시 담아서) 떠내야 함

SELECT * FROM (
   SELECT * FROM t1 JOIN t2 ON t1.a = t2.c
) SAMPLE (1);   -- 조인 결과의 약 1%
  • 그냥 JOIN ... SAMPLE바로 앞 테이블 한 개에만 적용됨 (주의!)

🎯 핵심 포인트

"한 알=베르누이(ROW), 박스=시스템(BLOCK), 기본은 한 알"
"정확히 N개(ROWS)엔 박스·도장 금지 → 에러"
"도장(SEED)은 박스(SYSTEM/BLOCK) 전용"
"빠르기: 박스>한알, 무(無)도장>도장"


0개의 댓글