전체 통(테이블)을 다 먹어볼 순 없으니,
무작위로 한 스푼 떠서 맛보는 것 = Table Sampling
SAMPLE이랑 TABLESAMPLE은 이름만 다른 쌍둥이 🍼 (완전히 같음)
사탕 한 알 한 알을 집을지 말지 동전을 던져 결정
→ 50%면 사탕마다 앞면 나온 것만 골라 담기
SELECT * FROM LINEITEM SAMPLE BERNOULLI (50); -- 각 행마다 50% 확률
사탕을 한 알씩이 아니라 박스(블록) 통째로 가져갈지 동전 던지기
→ 빠르지만, 박스가 몇 개 없으면 결과가 들쭉날쭉(편향) 🎲
SELECT * FROM LINEITEM SAMPLE SYSTEM (50); -- 각 블록마다 50% 확률
💡 박스(block) = 보통 micro-partition 한 개
💡 아무것도 안 적으면 기본은 BERNOULLI (한 알씩 던지기)
| 방식 | 비유 | 속도 | 정확도 |
|---|---|---|---|
| BERNOULLI / ROW | 알갱이마다 동전 | 느림 | 균일 |
| SYSTEM / BLOCK | 박스마다 동전 | 빠름 | 작은 테이블선 편향 |
"전체의 50%만 줘" → 통 크기에 따라 양이 달라짐 (대략치)
SELECT * FROM LINEITEM SAMPLE (50); -- 약 절반 (정확히 절반은 아님!)
"정확히 3알만 줘" → 통이 충분히 크면 칼같이 3개 반환
통에 3개도 없으면? → 있는 거 전부 다 줌
SELECT L_TAX, L_SHIPMODE FROM LINEITEM SAMPLE BERNOULLI (3 ROWS);
"딱 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알 줘"라고 했는데 "박스째로 무작위"는 말이 안 됨 →❌
매번 다른 한 스푼이 나오는데, 도장(SEED)을 찍으면 항상 똑같은 스푼
→ 같은 테이블 + 같은 도장 + 같은 확률 = 언제나 같은 결과 (재현 가능)
SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);
📍 중요: 도장(SEED)은 박스 방식(SYSTEM/BLOCK)에서만 찍을 수 있음
📍 view나 subquery 위에는 도장 못 찍음 (에러)
- 도장 안 찍으면 → 돌릴 때마다 다른 결과 (그리고 더 빠름)
| 그룹 | 쌍둥이 |
|---|---|
| 명령어 | SAMPLE = TABLESAMPLE |
| 알갱이 | BERNOULLI = ROW |
| 박스 | SYSTEM = BLOCK |
| 도장 | REPEATABLE = SEED |
조인한 결과를 한꺼번에 떠내고 싶으면 →
반드시 서브쿼리로 감싸서(통에 다시 담아서) 떠내야 함
SELECT * FROM (
SELECT * FROM t1 JOIN t2 ON t1.a = t2.c
) SAMPLE (1); -- 조인 결과의 약 1%
JOIN ... SAMPLE은 바로 앞 테이블 한 개에만 적용됨 (주의!)"한 알=베르누이(ROW), 박스=시스템(BLOCK), 기본은 한 알"
"정확히 N개(ROWS)엔 박스·도장 금지 → 에러"
"도장(SEED)은 박스(SYSTEM/BLOCK) 전용"
"빠르기: 박스>한알, 무(無)도장>도장"