Snowflake 비용 최적화 2026, 웨어하우스·예산·태그 운영 기준

Snowflake 비용 최적화는 창고 크기를 무작정 줄이는 일이 아니라 어떤 팀이 어떤 웨어하우스와 서버리스 기능으로 credit을 쓰는지 먼저 갈라내는 작업입니다.
대시보드 쿼리가 느리다는 이유로 Large를 올렸는데 auto suspend가 꺼져 있거나, 공유 웨어하우스가 부서별 query tag 없이 돌아가면 절감 포인트가 보이지 않습니다.
이 글은 공식 문서의 credit, 60초 최소 과금, Cost management 화면, resource monitor, budget, tag 기준을 묶어 운영자가 바로 점검할 순서로 정리합니다.
- 웨어하우스는 X-Small 1 credit/시간, Small 2 credit/시간처럼 크기가 커질수록 대체로 credit 소비가 2배씩 늘어납니다.
- Snowflake는 웨어하우스 시작 또는 재개마다 60초 최소 과금이 있고, 이후에는 실행이 이어지는 동안 초 단위로 계산합니다.
- Resource monitor는 표준 웨어하우스 비용을 quota와 threshold로 멈출 수 있지만, serverless 기능과 AI services는 budget으로 따로 봐야 합니다.
- Cost management 화면은 최대 72시간 지연될 수 있으므로 ACCOUNT_USAGE 조회와 태그 체계를 함께 운영해야 합니다.
이 글이 필요한 사람
- Snowflake 월 비용이 늘었지만 웨어하우스, 서버리스, 저장소 중 어느 축이 원인인지 분리하지 못한 데이터 플랫폼 담당자.
- 분석팀과 제품팀이 같은 warehouse를 공유해서 부서별 비용 배부 기준이 흐려진 FinOps 담당자.
- Resource monitor만 만들면 모든 항목이 멈춘다고 생각했지만 serverless task, search optimization, AI services 비용까지 봐야 하는 운영팀.
- 계약 단가를 공개 글 기준으로 단정하지 않고 credit 사용량, 크기, 시간, 태그, 권한으로 절감 구조를 만들려는 구매 담당자.
공식 비용 구조부터 분리해야 합니다
Snowflake 공식 문서는 전체 비용을 compute, storage, data transfer로 나누며, compute는 다시 user-managed virtual warehouse, serverless compute, cloud services로 나눕니다.
현재 credit 가격은 cloud, region, edition, Capacity 또는 On Demand 계약에 따라 달라지므로 글 안에서 임의의 달러 단가를 고정하면 위험합니다.
대신 운영팀은 먼저 credit 사용량과 과금 단위를 고정하고, 구매팀은 Snowflake Pricing Guide에서 조직 계약의 credit 가격을 곱해야 합니다.
| 비용 축 | 공식 기준 숫자 | 운영 해석 | 먼저 볼 증거 |
|---|---|---|---|
| Virtual warehouse | X-Small 1 credit/시간, Small 2 credit/시간, Medium 4 credit/시간, Large 8 credit/시간 | 크기 1단계 증설은 대체로 처리량과 credit 소비를 함께 키우므로 짧은 피크와 상시 대기를 분리합니다. | WAREHOUSE_METERING, warehouse size, auto suspend |
| 큰 warehouse | X-Large 16 credit/시간, 2X-Large 32 credit/시간, 3X-Large 64 credit/시간, 4X-Large 128 credit/시간 | 큰 창고를 계속 켜두면 쿼리 튜닝보다 idle time 제거가 먼저 절감 효과를 냅니다. | query elapsed time, queued time, cache hit pattern |
| 최소 과금 | 시작·재개마다 1분 최소, 이후 60초 이후는 초 단위 계산 | 짧은 쿼리마다 suspend/resume이 반복되면 1분 최소 구간이 여러 번 붙을 수 있습니다. | warehouse resume count, run duration |
| Cost 화면 | 비용 정보는 최대 72시간 뒤 보일 수 있음 | 당일 runaway는 화면만 기다리지 말고 ACCOUNT_USAGE 조회와 알림으로 별도 감시합니다. | Admin > Cost management, metering history |
| Budget refresh | 기본 최대 6.5시간, low latency 1시간은 비용이 12배가 될 수 있음 | 예산 감시는 월중 추세 확인용이고 초단위 차단 장치는 아닙니다. | budget refresh tier, notification route |
| Metering history | ACCOUNT_USAGE METERING_HISTORY는 최근 365일 hourly credit usage 조회 | 월별 결산뿐 아니라 최근 30일 팀별 showback 리포트의 기반으로 씁니다. | SERVICE_TYPE, NAME, CREDITS_USED_COMPUTE |
실무 시나리오 1: BI팀이 매일 08시부터 18시까지 Large warehouse를 켜두는 조직은 8 credit/시간 자체보다 idle 구간과 캐시 유지 판단을 먼저 봐야 합니다.
실무 시나리오 2: 야간 ETL이 2X-Large로 끝나지 않는 조직은 크기 축소보다 query timeout, queue timeout, 파일 분할, cluster key 검토가 먼저일 수 있습니다.
Cost management 화면과 SQL 조회를 같이 봅니다
Snowflake 공식 문서의 Cost management 경로는 Snowsight에서 Admin, Cost management, Consumption 순서로 전체 사용량을 보는 방식입니다.
조직 단위 비용 화면은 organization account 또는 ORGADMIN enabled account와 비용 관련 권한이 필요하며, Snowflake는 이 화면을 볼 때 X-Small warehouse 사용을 권장합니다.
이 조건이면 화면으로 추세를 보고 SQL로 원인을 찾는 흐름이 맞습니다.
- Admin > Cost management > Consumption에서 기간, account, usage type을 나눠 compute, storage, data transfer 비중을 확인합니다.
- 같은 기간을 ACCOUNT_USAGE METERING_HISTORY로 조회해 SERVICE_TYPE과 NAME 기준 상위 credit 소비 대상을 뽑습니다.
- WAREHOUSE_METERING과 QUERY_HISTORY를 함께 봐서 큰 warehouse가 실제로 시간을 줄였는지, idle만 늘었는지 구분합니다.
- 조직 계약 단가는 Pricing Guide 또는 내부 구매 계약서에서 확인하고, 공개 문서에는 credit 사용량 중심으로 남깁니다.
- Cost 화면 지연 가능성이 있으므로 runaway 감시는 resource monitor, budget, 별도 query job으로 보강합니다.
-- snowflake-cost-attribution.sql
-- 목적: 웨어하우스·서비스 유형별 credit 사용량을 팀 단위로 나눠 본다.
-- 실제 컬럼 노출 범위와 권한은 ACCOUNT_USAGE 접근 권한에 맞춰 확인한다.
WITH daily_metering AS (
SELECT
DATE_TRUNC('day', START_TIME) AS usage_day,
SERVICE_TYPE,
NAME AS cost_object,
SUM(CREDITS_USED_COMPUTE) AS compute_credits,
SUM(CREDITS_USED_CLOUD_SERVICES) AS cloud_services_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.METERING_HISTORY
WHERE START_TIME >= DATEADD(day, -30, CURRENT_TIMESTAMP())
GROUP BY 1, 2, 3
),
warehouse_tags AS (
SELECT
OBJECT_NAME AS warehouse_name,
TAG_VALUE AS cost_center
FROM SNOWFLAKE.ACCOUNT_USAGE.TAG_REFERENCES
WHERE DOMAIN = 'WAREHOUSE'
AND TAG_NAME = 'COST_CENTER'
)
SELECT
m.usage_day,
COALESCE(t.cost_center, 'untagged') AS cost_center,
m.SERVICE_TYPE,
m.cost_object,
ROUND(SUM(m.compute_credits), 2) AS compute_credits,
ROUND(SUM(m.cloud_services_credits), 2) AS cloud_services_credits
FROM daily_metering m
LEFT JOIN warehouse_tags t
ON UPPER(m.cost_object) = UPPER(t.warehouse_name)
GROUP BY 1, 2, 3, 4
ORDER BY usage_day DESC, compute_credits DESC;
위 SQL은 바로 복사해 확정할 보고서가 아니라 ACCOUNT_USAGE 접근 권한과 태그 전략을 확인하기 위한 검증 스켈레톤입니다.
이 경우는 비용이 큰 NAME이 모두 untagged로 나오면 warehouse size 조정보다 tag 체계와 query tag 적용이 먼저입니다.
웨어하우스 크기보다 idle과 timeout을 먼저 줄입니다
Snowflake warehouse는 실행 중일 때만 credit을 쓰지만, auto suspend가 길거나 꺼져 있으면 작업이 없어도 비용이 남습니다.
공식 cost control 문서는 CREATE WAREHOUSE, MODIFY, USAGE 권한을 분리해 아무나 warehouse를 만들거나 키우지 못하게 하라고 설명합니다.
또한 STATEMENT_TIMEOUT_IN_SECONDS와 STATEMENT_QUEUED_TIMEOUT_IN_SECONDS를 account, user, session, warehouse 단위로 둘 수 있습니다.
| 점검 항목 | 권장 판단 | 보류해야 할 조건 | 확인 위치 |
|---|---|---|---|
| Auto suspend | 일반 분석 warehouse는 300초 안팎부터 테스트합니다. | 캐시 유지가 SLA에 직접 연결된 서비스성 warehouse는 별도 측정 전 강제 축소하지 않습니다. | SHOW WAREHOUSES, Compute > Warehouses |
| Warehouse size | X-Small 또는 Small 기준으로 시작해 queue와 elapsed time을 봅니다. | Large 이상을 상시로 두는 결정은 상위 query와 사용자 동시성을 먼저 증명해야 합니다. | QUERY_HISTORY, warehouse load chart |
| Statement timeout | 장시간 runaway 쿼리를 3600초 같은 상한으로 먼저 끊어봅니다. | 정산 batch처럼 합법적으로 긴 작업은 별도 warehouse와 예외 정책을 둡니다. | SHOW PARAMETERS, ALTER WAREHOUSE |
| Queue timeout | 오래 기다린 쿼리가 뒤늦게 실행되어 비용을 쓰지 않도록 600초 같은 기준을 둡니다. | 대기 시간이 업무 요구사항이면 scale out 또는 작업 분리를 먼저 검토합니다. | STATEMENT_QUEUED_TIMEOUT_IN_SECONDS |
| Clustering key | 여러 TB급 테이블에서 선택적 필터가 반복될 때만 검토합니다. | DML이 잦은 테이블은 유지 비용이 커질 수 있으므로 baseline 없이는 보류합니다. | clustering depth, query profile |
이 조건이면 warehouse를 한 단계 키우는 대신 workload를 나누고 auto suspend와 timeout부터 적용합니다.
반대로 짧은 피크가 많고 queue가 업무 병목이면 multi-cluster나 큰 warehouse가 더 싼 선택이 될 수 있습니다.
Resource monitor와 budget의 역할을 섞지 않습니다
Resource monitor는 credit quota와 threshold를 기준으로 표준 virtual warehouse를 suspend하거나 즉시 suspend하는 장치입니다.
공식 문서는 account monitor는 account당 1개이고, warehouse monitor는 여러 개 만들 수 있지만 각 warehouse는 하나의 monitor에만 배정된다고 설명합니다.
중요한 차이는 resource monitor가 serverless features와 AI services 지출을 추적하지 못한다는 점입니다.
이 경우는 serverless task, search optimization, Snowpipe Streaming, Cortex 계열 사용량을 budget과 METERING_HISTORY로 따로 봐야 합니다.
| 통제 도구 | 공식 숫자 | 멈출 수 있는 범위 | 실무 기준 |
|---|---|---|---|
| Resource monitor | 예시 quota 1000 credits, threshold는 70%, 90%, 100%, 110%처럼 설정 가능 | 표준 warehouse와 cloud services 보조 사용량 중심 | 월 quota와 suspend action을 운영팀 승인 흐름에 연결합니다. |
| Account budget | 월 1개월 단위 spending limit과 예측 알림 | 계정 전체 또는 지원 서비스의 credit 소비 추세 | 서버리스와 AI services까지 월중 초과 조짐을 봅니다. |
| Custom budget | 태그로 묶은 리소스는 월초 이후 데이터 backfill 가능 | 특정 object 그룹 또는 cost center | 팀·프로젝트 태그 기준 showback에 맞춥니다. |
| Low latency budget | 기본 최대 6.5시간 refresh를 1시간으로 낮추면 비용이 12배가 될 수 있음 | 민감 기간의 예산 감시 | 장애 대응 주간이나 마이그레이션 기간에만 임시로 씁니다. |
-- snowflake-resource-monitor-skeleton.sql
-- 목적: 표준 웨어하우스 runaway 사용을 월 quota와 threshold로 막는다.
-- 적용 전 ACCOUNTADMIN 권한, 알림 통합, 예외 웨어하우스를 검토한다.
CREATE RESOURCE MONITOR finops_monthly_monitor
WITH CREDIT_QUOTA = 1000
FREQUENCY = MONTHLY
START_TIMESTAMP = IMMEDIATELY
TRIGGERS
ON 70 PERCENT DO NOTIFY
ON 90 PERCENT DO NOTIFY
ON 100 PERCENT DO SUSPEND
ON 110 PERCENT DO SUSPEND_IMMEDIATE;
ALTER WAREHOUSE etl_wh SET RESOURCE_MONITOR = finops_monthly_monitor;
ALTER WAREHOUSE analyst_wh SET RESOURCE_MONITOR = finops_monthly_monitor;
SHOW RESOURCE MONITORS;
SHOW WAREHOUSES;
이 SQL은 월 quota 예시를 고정한 스켈레톤이며, 실제 quota는 계약 credit, 업무 피크, 내부 승인 흐름에 맞춰 조정해야 합니다.
100%에서 suspend를 걸면 비용은 막을 수 있지만, 업무 쿼리 중단 책임자가 없으면 장애로 보일 수 있습니다.
태그와 query tag가 없으면 절감 회의가 감상으로 끝납니다
Snowflake 공식 cost attribution 문서는 부서, 환경, 프로젝트 같은 논리 단위로 비용을 나누려면 object tag와 query tag를 같이 쓰라고 설명합니다.
전용 warehouse는 object tag로 비용을 배부하고, 여러 부서가 쓰는 warehouse는 user tag 또는 query tag로 쿼리 단위 사용자를 나눠야 합니다.
이 조건이면 팀별 showback 보고서는 warehouse 이름보다 cost_center, environment, owner 태그를 기준으로 만들어야 합니다.
- warehouse, database, schema, task, table에 cost_center, environment, owner tag를 표준화합니다.
- 애플리케이션이 대신 실행하는 쿼리는 query tag에 service, feature, customer tier 같은 낮은 민감도 값을 넣습니다.
- 개인정보, 고객명, 티켓 번호, 이메일을 tag 값에 넣지 않는 금지어 검사를 둡니다.
- 월말 보고서는 untagged credit, owner unknown, 500 credits 이상 급증 warehouse부터 회의 안건으로 올립니다.
- 비용 배부가 다툼으로 번지면 shared warehouse를 cost center별 warehouse로 분리하는 안을 같이 검토합니다.
# snowflake-finops-operating-policy.yaml
owner: data-platform-lead
review_cycle: monthly
minimum_controls:
warehouse_tags:
required: [cost_center, environment, owner]
reject_values: [unknown, temporary, personal]
warehouse_defaults:
auto_suspend_seconds: 300
auto_resume: true
initial_size: X-SMALL
resource_monitor:
account_quota_credits: 1000
notify_thresholds_percent: [70, 90]
suspend_threshold_percent: 100
budget:
refresh_tier: default_6_5_hours
low_latency_budget_exception: incident_watch_only
query_limits:
statement_timeout_seconds: 3600
queued_timeout_seconds: 600
acceptance_evidence:
- last_30_days_metering_by_service_type
- untagged_warehouse_count
- warehouses_without_auto_suspend
- top_20_queries_by_elapsed_time
- budget_notification_route_test
태그 체계는 보안 정책이기도 하므로 누구나 마음대로 cost_center를 만들 수 없게 tag_admin 역할과 변경 승인 절차를 둬야 합니다.
이 경우는 비용 절감보다 책임 소재 확인이 먼저이며, 책임자가 정해진 뒤 warehouse 크기와 query 튜닝을 논의해야 합니다.
저장소·클러스터링·서버리스 비용은 별도 의사결정으로 둡니다
Snowflake의 storage 비용은 월 평균 on-disk bytes 기준이며, compressed TB와 retention, fail-safe, clone 사용 패턴이 함께 영향을 줍니다.
Data transfer는 ingress가 아니라 egress와 region 또는 cloud 이동 조건을 중심으로 봐야 합니다.
Clustering key는 매우 큰 테이블의 선택적 쿼리에 효과가 있을 수 있지만, 자동 유지 작업도 credit을 쓰므로 모든 테이블에 넣으면 비용이 커질 수 있습니다.
| 영역 | 검토 신호 | 선택 기준 | 실패 신호 |
|---|---|---|---|
| Storage | 평균 65 TB compressed 같은 대용량 보관이 늘어남 | 보관 정책, retention, clone, stage 정리를 월 1회 봅니다. | 테이블 삭제 후 storage가 줄지 않아도 원인을 추적하지 못함 |
| Data transfer | region 또는 cloud 간 복제와 공유가 늘어남 | egress 경로를 아키텍처 설계 때 비용 항목으로 둡니다. | 백업과 공유 정책이 비용 회의에 빠짐 |
| Clustering key | 여러 TB 테이블에서 같은 필터가 반복됨 | baseline query와 clustering depth 개선을 같이 봅니다. | DML 많은 테이블에 3개 또는 4개 초과 key를 넣음 |
| Serverless features | Search optimization, task, pipe, AI services가 늘어남 | budget과 service type 리포트로 warehouse와 분리합니다. | resource monitor만 믿고 serverless 초과를 놓침 |
이 조건이면 저장소는 압축률과 retention 정책, compute는 warehouse 실행 시간, serverless는 service type별 credit으로 서로 다른 회의 안건이 됩니다.
하나의 절감률 목표로 세 영역을 몰아붙이면 성능 장애, 데이터 보존 누락, 예측 불가능한 서버리스 증가가 섞여서 원인을 잃습니다.
30일 운영 점검 순서
Snowflake 비용 최적화는 한 번의 크기 조정이 아니라 30일 동안 근거를 모으고 정책을 고정하는 운영 루프에 가깝습니다.
- 1일차: 최근 30일 METERING_HISTORY에서 SERVICE_TYPE과 NAME 기준 상위 20개 비용 대상을 뽑습니다.
- 2일차: 상위 warehouse의 size, auto_suspend, auto_resume, owner tag, resource monitor 배정을 확인합니다.
- 3일차: Cost management 화면에서 compute, storage, data transfer 비중을 나누고 화면 지연 가능성을 notes에 남깁니다.
- 1주차: untagged warehouse와 shared warehouse를 정리하고 cost_center 기준 showback 표를 만듭니다.
- 2주차: statement timeout과 queue timeout을 작은 범위부터 적용하고 실패 query 예외 목록을 만듭니다.
- 3주차: budget notification route를 이메일, SNS, Event Grid, PubSub, webhook 중 조직 표준으로 테스트합니다.
- 4주차: 비용 감소, queue 증가, failed query, 사용자 불만, SLA 영향까지 묶어 다음달 quota와 warehouse default를 갱신합니다.
# snowflake_budget_guardrail.py
# 목적: 비용 대시보드만 기다리지 않고 운영팀이 볼 경고 후보를 만든다.
# 실제 접속 계정, 키 보관, 알림 전송은 조직 보안 정책으로 분리한다.
from dataclasses import dataclass
@dataclass
class WarehouseFinding:
name: str
size: str
auto_suspend_seconds: int | None
monthly_credits: float
owner: str
def judge_warehouse(row: WarehouseFinding) -> list[str]:
findings = []
if row.auto_suspend_seconds in (None, 0):
findings.append('auto_suspend_disabled')
if row.monthly_credits >= 500 and row.owner == 'unknown':
findings.append('high_cost_without_owner')
if row.size in {'2X-LARGE', '3X-LARGE', '4X-LARGE'} and row.monthly_credits >= 1000:
findings.append('large_warehouse_budget_review')
return findings
sample = WarehouseFinding(
name='ANALYST_WH',
size='LARGE',
auto_suspend_seconds=300,
monthly_credits=420.5,
owner='data-analytics',
)
print(judge_warehouse(sample))
이 스크립트는 운영 리포트의 판단 로직 예시이며, 실제 Snowflake 접속 정보나 알림 자격 정보는 코드에 넣지 않는 전제로 분리해야 합니다.
보류해야 할 경우도 있습니다.
- 월말 결산 전 72시간 안의 화면 수치만 보고 계약 단가 문제로 단정하는 경우.
- 분석팀 SLA가 있는데 auto suspend를 일괄 60초로 줄여 첫 쿼리 지연을 키우는 경우.
- resource monitor suspend action의 장애 책임자 없이 100% 차단만 거는 경우.
- 개인정보가 들어간 query tag로 showback을 시도하는 경우.
- clustering key 유지 비용을 측정하지 않고 모든 큰 테이블에 적용하는 경우.
함께 보면 좋은 글
자주 묻는 질문
Snowflake 비용 최적화에서 가장 먼저 볼 항목은 무엇인가요?
최근 30일 METERING_HISTORY의 SERVICE_TYPE과 NAME 기준 상위 credit 소비 대상을 먼저 보고, 그 다음 warehouse size와 auto suspend를 확인합니다.
X-Small 1 credit/시간이면 항상 X-Small이 가장 저렴한 선택인가요?
아니요, 큰 warehouse가 쿼리 시간을 충분히 줄여 전체 실행 시간이 짧아지는 workload라면 작은 warehouse보다 총 credit이 낮을 수 있습니다.
Resource monitor만 만들면 Snowflake 비용 초과를 막을 수 있나요?
아니요, resource monitor는 주로 표준 warehouse 통제 장치이며 serverless 기능과 AI services는 budget과 usage view로 따로 감시해야 합니다.
Cost management 화면과 ACCOUNT_USAGE 값이 다르게 보이면 무엇을 확인해야 하나요?
공식 문서상 Cost management 정보는 최대 72시간 늦을 수 있으므로 기간, UTC 기준, 권한, usage type filter를 먼저 맞춰야 합니다.
Clustering key는 비용 절감에 항상 유리한가요?
아니요, 여러 TB 테이블에서 선택적 쿼리가 반복되고 DML이 낮은 경우에 검토하며, 유지 credit이 성능 절감보다 크면 보류해야 합니다.
Snowflake credit 단가는 왜 본문에서 고정하지 않았나요?
공식 문서가 credit 가격을 계정 유형, region, edition, 계약 방식에 따라 Pricing Guide에서 확인하라고 안내하므로 조직 계약 단가를 내부에서 확인해야 합니다.
출처와 확인일
- Snowflake Docs — Understanding overall cost (확인일: 2026-07-27)
- Snowflake Docs — Understanding compute cost (확인일: 2026-07-27)
- Snowflake Docs — Warehouse considerations (확인일: 2026-07-27)
- Snowflake Docs — Cost controls for warehouses (확인일: 2026-07-27)
- Snowflake Docs — Working with resource monitors (확인일: 2026-07-27)
- Snowflake Docs — Monitor credit usage with budgets (확인일: 2026-07-27)
- Snowflake Docs — Attributing cost (확인일: 2026-07-27)
- Snowflake Docs — Exploring overall cost (확인일: 2026-07-27)
- Snowflake Docs — METERING_HISTORY view (확인일: 2026-07-27)
- Snowflake Docs — Clustering Keys and Clustered Tables (확인일: 2026-07-27)
- Snowflake — Snowflake Pricing Guide (확인일: 2026-07-27)
위 출처는 2026-07-27 기준으로 확인했으며, Snowflake credit 가격, Cost management 화면, budget refresh, resource monitor action, serverless 기능 범위는 cloud, region, edition, 계약 조건,
계정 권한에 따라 달라질 수 있습니다.
이 글은 일반적인 데이터 플랫폼 비용 운영 검토 자료이며, 실제 예산 집행, 계약 단가, 개인정보 처리, 보안 정책은 공식 문서와 조직 내부 책임자 검토를 기준으로 최종 확인해야 합니다.






댓글
댓글 쓰기