Snowflake는 스토리지 / 컴퓨팅 / 클라우드 서비스 3개 레이어로 구성된 아키텍처를 가진다.
그 중 Storage Layer는 실제 데이터가 저장되는 최하단 계층이다.
Cloud Services Layer
↓
Compute Layer (Virtual Warehouse)
↓
Storage Layer ← 여기!
↓
AWS S3 / Azure Blob Storage / GCP Cloud Storage
💡 핵심 포인트
Snowflake는 자체 스토리지 하드웨어를 보유하지 않는다.
AWS S3, Azure Blob Storage, GCP Cloud Storage 같은 클라우드 제공업체의 오브젝트 스토리지 위에서 동작한다.
클라우드 오브젝트 스토리지 위에서 동작하기 때문에 두 가지 강력한 특성을 자동으로 얻는다.
| 특성 | 내용 |
|---|---|
| 확장성 | 용량 제한 없이 무한 확장 가능 |
| 내구성 | 99.9999999% (eleven nines) — AWS S3 기준 |
💡 왜 내구성이 높은가?
Snowflake 자체가 내구성을 만드는 것이 아니라, AWS S3의 내구성을 by proxy(위임) 방식으로 그대로 받는다.
즉, Snowflake 사용자는 자동으로 클라우드 제공업체의 SLA 보장을 받는다.
Snowflake에 올라간 데이터는 전통적인 관계형 DB와 동일한 3단계 계층 구조로 관리된다.
Database
└── Schema A
│ ├── Table 1
│ └── Table 2
└── Schema B
├── Table 3
└── Table 4
MySQL이나 PostgreSQL을 사용해 본 경험이 있다면 바로 익숙한 구조다.
USE DATABASE → USE SCHEMA → SELECT * FROM table 순서로 접근한다.
외부에서 데이터를 적재(Load)할 때 정형 데이터와 반정형 데이터 모두 지원한다.
| 포맷 | 설명 |
|---|---|
| CSV | 쉼표로 구분된 텍스트 파일, 가장 일반적인 정형 데이터 포맷 |
| 포맷 | 설명 |
|---|---|
| JSON | 키-값 쌍 기반의 유연한 데이터 포맷 |
| Avro | 스키마 포함 바이너리 직렬화 포맷 (Kafka와 주로 사용) |
| ORC | Hadoop 생태계의 컬럼형 스토리지 포맷 |
| Parquet | Apache 계열의 컬럼형 스토리지 포맷 (분석에 최적화) |
| XML | 태그 기반 마크업 언어 |
💡 반정형 데이터(Semi-structured)란?
스키마가 고정되지 않은 유연한 구조의 데이터.
JSON처럼 키-값 쌍으로 이루어져 있고, 필드가 행마다 다를 수 있다.
Snowflake는VARIANT타입으로 이를 저장하고 SQL로 쿼리할 수 있게 지원한다.
파일을 업로드하거나 INSERT를 실행하면, Snowflake는 데이터를 원본 포맷 그대로 보관하지 않고
자체적인 압축 컬럼형(Columnar) 파일 포맷으로 자동 변환해서 저장한다.
Row-oriented (전통 RDBMS)
[id=1, name=Kim, age=25]
[id=2, name=Lee, age=30]
[id=3, name=Park, age=22]
Column-oriented (Snowflake)
[id: 1, 2, 3 ]
[name: Kim, Lee, Park]
[age: 25, 30, 22 ]
분석 쿼리는 보통 전체 행이 아니라 특정 컬럼 몇 개만 읽는다.
컬럼형은 필요한 컬럼만 I/O하므로 쿼리가 빠르고 압축률도 높다.
데이터가 저장될 때 Snowflake는 자동으로 데이터를 마이크로 파티션이라는 작은 단위로 나눠서 보관한다.
┌────┬────┬────┬────┬────┬────┬────┬─────┐
│ P1 │ P2 │ P3 │ P4 │ P5 │ P6 │ P7 │ ... │
└────┴────┴────┴────┴────┴────┴────┴─────┘
| 항목 | 내용 |
|---|---|
| 파티션 크기 (압축 전) | 50 ~ 500 MB |
| 파티션 지정 방식 | 자동 (사용자가 직접 설정 불필요) |
| 저장 방식 | 각 파티션 내부도 컬럼형으로 저장 |
💡 Partition Pruning — 마이크로 파티션이 쿼리 성능에 미치는 영향
쿼리를 실행하면 Snowflake는 조건에 맞는 파티션만 골라서 읽는다.
예를 들어WHERE date = '2025-01-01'조건이면, 해당 날짜 데이터가 있는 파티션만 스캔하므로
전체 데이터를 읽지 않아도 되어 성능이 크게 향상된다.
스토리지 비용은 쿼리 횟수와 무관하게 저장된 데이터의 용량 기준 월정액으로 청구된다.
비용 = 저장된 데이터 용량(TB) × 단가($/TB/월)
📌 예시 요금 (AWS 유럽 런던 리전 기준)
$42.00 / TB / 월
실제 사용 리전과 클라우드 제공업체에 따라 가격이 다르므로 반드시 공식 가격표를 확인해야 한다.
⚠️ 주의: Time Travel & Fail-safe 비용
Snowflake는 변경/삭제된 데이터도 일정 기간 보관하는 Time Travel(최대 90일)과 Fail-safe 기능을 제공한다.
이 보존 데이터도 스토리지 비용에 포함되므로 비용 계획 시 반드시 고려해야 한다.
스토리지 레이어의 데이터는 S3 버킷에 직접 접근하는 방식으로는 열 수 없다.
반드시 SQL 명령어를 통해서만 접근 가능하다.
-- 테이블 전체 조회
SELECT * FROM my_table;
-- 특정 컬럼만 조회
SELECT user_id, created_at
FROM my_table
WHERE created_at >= '2025-01-01';
💡 왜 SQL만 허용하는가?
내부 파일이 Snowflake 고유 포맷으로 변환되어 있어 외부에서 직접 열어도 읽을 수 없다.
이 추상화 덕분에 사용자는 파일 포맷이나 파티션 구조를 전혀 신경 쓰지 않고 SQL만으로 데이터를 다룰 수 있다.
| 항목 | 내용 |
|---|---|
| 저장 위치 | 클라우드 Blob Storage (AWS S3 등) — 위임 구조 |
| 확장성 | 무제한 (자동) |
| 내구성 | 99.9999999% (eleven nines, AWS S3 기준) |
| 저장 포맷 | 독자 압축 컬럼형(Columnar) 포맷 — 자동 변환 |
| 파티셔닝 | 마이크로 파티션 (50~500MB) — 자동 |
| 지원 입력 포맷 | CSV, JSON, Avro, ORC, Parquet, XML |
| 과금 기준 | 저장 용량 × 월정액 (쿼리 횟수 무관) |
| 데이터 접근 | SQL 명령어만 가능 (직접 파일 접근 불가) |
- 컬럼형 저장 방식 — 왜 분석 쿼리에 유리한지 이해하기
- 마이크로 파티션의 Partition Pruning — 쿼리 성능 향상 메커니즘
- 과금이 쿼리 횟수와 무관 — 저장 용량 기준 월정액 청구