← 학습 카테고리

Learn

Snowflake

11개 모듈 · 현재 4번째

Snowflake 모듈 4/11 snowflake-learn-04

3단 캐싱 구조 — Result / Local Disk / Metadata Cache

55 Snowflake Interview Questions Hiring DEs Actually Ask (2026) — 미상 (데이터 엔지니어 인터뷰 준비 블로그, 2026) Performance & Optimization Q23, Q30 (pp.8-9, 11); [보조] Snowflake vs BigQuery vs Redshift - Storage Design and Query Execution Basics: Snowflake 절의 로컬 캐싱/일관 해싱 설명 (p.6)

이 모듈을 다 읽으면

  • Result Cache, Local Disk Cache, Metadata Cache 세 계층이 각각 무엇을 캐싱하는지 구분할 수 있다
  • Result Cache의 실제 보존 정책(단순한 24시간 고정 창이 아니라는 점)을 설명할 수 있다
  • 성능 테스트 시 캐시를 배제하기 위해 어떤 조치가 필요한지 판단할 수 있다

Snowflake는 클라우드 서비스 계층의 Result Cache·Metadata Cache와 웨어하우스 로컬 SSD의 Local Disk Cache라는 3단 캐싱 구조로 반복 쿼리와 반복 스캔 비용을 줄인다. 다만 원문이 서술한 'Result Cache는 최근 24시간의 결과를 저장한다'는 설명은 정확히는 '재사용될 때마다 보존 기간이 24시간씩 갱신되며 최초 실행 후 최대 31일까지 유지된다'는 정책을 단순화한 것이어서, 실무에서 '언제 캐시가 사라지는가'를 판단할 때는 이 갱신 메커니즘을 정확히 알아야 한다.

세 가지 캐시 계층

Snowflake의 캐싱은 세 계층으로 나뉜다.

첫째, Result Cache. 클라우드 서비스 계층에 위치하며, 실행된 쿼리의 결과 자체를 저장한다. 동일한 SQL 텍스트가 동일한 역할·권한으로 다시 실행되고 기반 데이터가 변경되지 않았다면, 컴퓨트를 전혀 쓰지 않고 즉시 결과를 반환한다 — 심지어 원래 쿼리를 실행했던 웨어하우스가 이미 정지된 상태여도 동작한다.

둘째, Local Disk Cache(흔히 '데이터 캐시'라고도 불린다). 가상 웨어하우스의 로컬 SSD에 마이크로파티션 데이터를 캐싱해, 같은 데이터를 다시 스캔할 때 클라우드 스토리지가 아닌 SSD에서 읽도록 한다. 이 캐시는 웨어하우스별로 존재하므로 웨어하우스가 정지(suspend)되면 사라진다.

셋째, Metadata Cache. 클라우드 서비스 계층에 위치하며, 마이크로파티션별 min/max/null count 같은 통계를 보관한다. 이 캐시 덕분에 옵티마이저는 쿼리가 실제로 시작되기도 전에 프루닝 계획을 세울 수 있다(모듈 2 참고).

핵심 포인트

  • Result Cache는 클라우드 서비스 계층에서 동일 쿼리의 결과 자체를 재사용해 컴퓨트 사용 없이 즉시 응답한다
  • Local Disk Cache는 웨어하우스별 로컬 SSD에 마이크로파티션을 캐싱하며, 웨어하우스가 정지되면 사라진다
  • Metadata Cache는 마이크로파티션 통계를 보관해 쿼리 시작 전 프루닝 계획 수립을 가능하게 한다

Result Cache 보존 정책 — 정정

정정 — 원문(Q23)은 Result Cache를 '지난 24시간 동안 실행된 모든 쿼리의 결과를 저장한다'고 설명하지만, 이는 실제 정책을 단순화한 서술이다. 정확한 동작은 다음과 같다: 결과는 최초 실행 시점부터 24시간 동안 보존되지만, 그 기간 안에 동일한 쿼리가 다시 실행되어 캐시가 재사용될 때마다 보존 기간이 다시 24시간으로 갱신(reset)된다. 이 갱신이 반복되더라도 최초 실행 시점으로부터 최대 31일이 지나면 캐시는 무조건 만료된다.

즉 'Result Cache는 24시간이 지나면 사라진다'는 이해는 자주 재사용되는 쿼리(예: 매일 아침 여러 명이 조회하는 대시보드 쿼리)에는 맞지 않는다 — 계속 재사용되는 한 최대 31일까지 캐시가 유지될 수 있다. 반대로 한 번 실행되고 다시는 호출되지 않는 쿼리는 정확히 24시간 뒤에 캐시가 사라진다.

핵심 포인트

  • Result Cache는 고정된 24시간 창이 아니라, 재사용될 때마다 보존 기간이 24시간씩 갱신되는 정책이다
  • 갱신이 반복되어도 최초 실행 시점으로부터 최대 31일이 지나면 캐시는 무조건 만료된다
  • 자주 재사용되는 쿼리일수록 24시간보다 훨씬 오래(최대 31일) 캐시가 유지될 수 있다

캐시를 배제한 성능 테스트

성능 테스트나 벤치마크에서 '콜드 런' 시간을 측정하려면 Result Cache의 영향을 제거해야 한다. 세션 레벨에서 ALTER SESSION SET USE_CACHED_RESULT = FALSE; 를 실행하면 Result Cache를 무시하고 쿼리를 강제로 재실행한다.

다만 이것만으로 완전히 '콜드'한 측정이 되지는 않는다는 점에 유의해야 한다. 웨어하우스가 이미 가동 중이고 이전 쿼리들로 인해 Local Disk Cache에 관련 마이크로파티션이 이미 적재되어 있다면, Result Cache를 꺼도 로컬 SSD 캐시 덕분에 실제보다 빠른 결과가 나올 수 있다. 진짜 '완전히 식은' 상태를 측정하려면 웨어하우스를 재개(resume)한 직후, 즉 로컬 디스크 캐시가 비어 있는 상태에서 측정해야 한다.

핵심 포인트

  • ALTER SESSION SET USE_CACHED_RESULT = FALSE;로 Result Cache를 세션 단위로 우회할 수 있다
  • Result Cache를 꺼도 Local Disk Cache가 이미 채워져 있으면 완전한 콜드 런이 아니다
  • 진짜 콜드 성능을 측정하려면 웨어하우스를 새로 재개한 직후 상태에서 테스트해야 한다