[Snowflake] Caching & Materialized Views

์ฐจ์ง€์˜ˆยท2026๋…„ 6์›” 9์ผ

Snowflake

๋ชฉ๋ก ๋ณด๊ธฐ
35/49
post-thumbnail

1๏ธโƒฃ Caching (์บ์‹ฑ)

๐Ÿ›๏ธ 3-Layer๋ณ„ ์บ์‹œ ์œ„์น˜ (โญ)

์บ์‹œ์œ„์น˜
Metadata CacheServices Layer
Results CacheServices Layer
Local Disk Cache (Warehouse Cache)Warehouse Layer
Remote DiskStorage Layer (์›๋ณธ, ์บ์‹œ X)

๐Ÿ”‘ ์•”๊ธฐ: ๋ฉ”ํƒ€+๊ฒฐ๊ณผ = ์„œ๋น„์Šค / ๋กœ์ปฌ๋””์Šคํฌ = ์›จ์–ดํ•˜์šฐ์Šค


Metadata Cache

  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(ํ†ต๊ณ„ ์ •๋ณด) ์ €์žฅ โ†’ ์ผ๋ถ€ ์ฟผ๋ฆฌ๋Š” ์›จ์–ดํ•˜์šฐ์Šค ์—†์ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์›จ์–ดํ•˜์šฐ์Šค ์—†์ด ์ฒ˜๋ฆฌ๋˜๋Š” ์ฟผ๋ฆฌ:
SELECT COUNT(*) FROM MY_TABLE;
SELECT CURRENT_DATABASE();
DESCRIBE TABLE MY_TABLE;
SHOW TABLES;

๐Ÿ”‘ ์•”๊ธฐ: COUNT(*), SHOW, DESCRIBE โ†’ ์›จ์–ดํ•˜์šฐ์Šค ๋ถˆํ•„์š” (ํฌ๋ ˆ๋”ง ์ ˆ์•ฝ)


Results Cache (โญโญ)

๊ธฐ๊ฐ„

  • ๊ธฐ๋ณธ 24์‹œ๊ฐ„ โ†’ ์žฌ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค 24์‹œ๊ฐ„ ์—ฐ์žฅ โ†’ ์ตœ๋Œ€ 31์ผ

์žฌ์‚ฌ์šฉ 3๋Œ€ ์กฐ๊ฑด

  1. ์ฟผ๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ๋™์ผ
  2. ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์—†์Œ
  3. ๊ฐ™์€ Role ์‚ฌ์šฉ

๐Ÿ”‘ ์•”๊ธฐ: ๊ฐ™์€ ์ฟผ๋ฆฌ + ๋ฐ์ดํ„ฐ ๊ทธ๋Œ€๋กœ + ๊ฐ™์€ Role

์ฃผ์˜

  • CURRENT_TIME() ๋“ฑ ์‹œ๊ฐ„ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ โ†’ ์บ์‹œ ์‚ฌ์šฉ ์•ˆ ๋จ
  • ๋น„ํ™œ์„ฑํ™”:
ALTER SESSION SET USE_CACHED_RESULT = FALSE;
  • ๋ชจ๋“  ์›จ์–ดํ•˜์šฐ์Šค์—์„œ ๊ณต์œ ๋จ (์กฐ๊ฑด ์ถฉ์กฑ ์‹œ ๋‹ค๋ฅธ ์œ ์ €๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

Local Disk Cache (Warehouse Cache)

  • ์›จ์–ดํ•˜์šฐ์Šค SSD์— raw ๋ฐ์ดํ„ฐ ์ €์žฅ
  • ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ํด์ˆ˜๋ก ์บ์‹œ๋„ ํผ
  • Resize / Suspend / Drop ์‹œ โ†’ ์ œ๊ฑฐ๋จ (โญ)
  • ๋ถ€๋ถ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๋‚˜๋จธ์ง€๋Š” remote์—์„œ ์ฝ์Œ)

๐Ÿ”‘ ์•”๊ธฐ: ์บ์‹œ ์‚ญ์ œ ํŠธ๋ฆฌ๊ฑฐ = RยทSยทD (ResizeยทSuspendยทDrop)


2๏ธโƒฃ Materialized Views (MV)

์ •์˜

"SELECT ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋งŒ๋“  ์‚ฌ์ „ ๊ณ„์‚ฐ + ์˜๊ตฌ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์…‹"

  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋กœ ์ž๋™ ์—…๋ฐ์ดํŠธ (base table๊ณผ ๋™๊ธฐํ™”)
  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • Enterprise Edition ์ด์ƒ / Serverless (โญ)

์ผ๋ฐ˜ View vs MV

์ผ๋ฐ˜ ViewMV
๋ฐ์ดํ„ฐ ์ €์žฅโŒ (์ฟผ๋ฆฌ๋งŒ)โœ… (๊ฒฐ๊ณผ ์ €์žฅ)
์†๋„๋งค๋ฒˆ ์‹คํ–‰๋ฏธ๋ฆฌ ๊ณ„์‚ฐ โ†’ ๋น ๋ฆ„
๋น„์šฉ์กฐํšŒ ์‹œ๋งŒ์Šคํ† ๋ฆฌ์ง€ + ์ž๋™ ์œ ์ง€ ์ปดํ“จํŒ…

๋น„์šฉ & ์œ ์ง€๊ด€๋ฆฌ

  • ์ž๋™ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์œ ์ง€ โ†’ ์ปดํ“จํŒ… ์‚ฌ์šฉ
  • ๊ฒฐ๊ณผ ์ €์žฅ โ†’ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ (์›” ์Šคํ† ๋ฆฌ์ง€ ๋น„์šฉ ์ถ”๊ฐ€)
  • External Table ์œ„์— ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋ชจ๋‹ˆํ„ฐ๋ง: MATERIALIZED_VIEW_REFRESH_HISTORY

์ œ์•ฝ์‚ฌํ•ญ (โญโญโญ)

  1. ๋‹จ์ผ ํ…Œ์ด๋ธ”๋งŒ ๊ฐ€๋Šฅ
  2. JOIN ๋ถˆ๊ฐ€ (self-join ํฌํ•จ)
  3. ๊ธˆ์ง€: UDF / Window Function / HAVING / ORDER BY / LIMIT

๐Ÿ”‘ ์•”๊ธฐ: "MV๋Š” ํ˜ผ์ž(๋‹จ์ผํ…Œ์ด๋ธ”) ๋‹ค๋‹ˆ๊ณ , JOINยทUDFยทWindowยทHAVINGยทORDER BYยทLIMIT ์•ˆ ๋จ"


DDL ๋ช…๋ น์–ด

CREATE OR REPLACE MATERIALIZED VIEW MV1 AS
  SELECT COL1, COL2 FROM T1;

ALTER MATERIALIZED VIEW MV1 SUSPEND;   -- ์ค‘์ง€
ALTER MATERIALIZED VIEW MV1 RESUME;    -- ์žฌ๊ฐœ
SHOW MATERIALIZED VIEWS LIKE 'MV1%';   -- ์กฐํšŒ

๐Ÿ“Œ ํ•ต์‹ฌ ์š”์•ฝ

  • ๋ฉ”ํƒ€+๊ฒฐ๊ณผ = Services, ๋กœ์ปฌ๋””์Šคํฌ = Warehouse
  • Results Cache = 24h ~ ์ตœ๋Œ€ 31์ผ, ์กฐ๊ฑด = ๊ฐ™์€์ฟผ๋ฆฌ+๋ฐ์ดํ„ฐ๋ถˆ๋ณ€+๊ฐ™์€Role
  • USE_CACHED_RESULT=FALSE โ†’ ๊ฒฐ๊ณผ ์บ์‹œ ๋„๊ธฐ
  • COUNT(*)/SHOW/DESCRIBE โ†’ ์›จ์–ดํ•˜์šฐ์Šค ๋ถˆํ•„์š”
  • Local Cache ์‚ญ์ œ = Resize/Suspend/Drop
  • MV = Enterprise, ๋‹จ์ผ ํ…Œ์ด๋ธ”, JOIN ๋ถˆ๊ฐ€, UDFยทWindowยทHAVINGยทORDER BYยทLIMIT ๋ถˆ๊ฐ€

0๊ฐœ์˜ ๋Œ“๊ธ€