2026๋ Snowflake: ์ํคํ ์ฒ, SQL, ๋ฐ์ดํฐ ์์ง๋์ด ๋ฉด์ ์ง๋ฌธ
๋ฐ์ดํฐ ์์ง๋์ด๋ฅผ ์ํ 2026๋ Snowflake ์ํคํ ์ฒ ๊ฐ์ด๋์ ๋๋ค. ์คํ ๋ฆฌ์ง์ ์ปดํจํธ๊ฐ ์ด๋ป๊ฒ ๋ถ๋ฆฌ๋๋์ง, virtual warehouse์ micro-partition์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค์ ํ๋ก๋์ ๊ฒฝํ์ ๊ฒ์ฆํ๋ ๋ฉด์ ์ง๋ฌธ์ ๋ค๋ฃน๋๋ค.

Snowflake ๋ฉด์ ์ง๋ฌธ์ ๋ฐ์ดํฐ ์์ง๋์ด๊ฐ SQL ๋ฌธ๋ฒ๋ฟ ์๋๋ผ ํ๋ซํผ์ ๋ถ๋ฆฌ๋ ์ํคํ ์ฒ๋ฅผ ์ดํดํ๊ณ ์๋์ง๋ฅผ ๊ฒ์ฆํฉ๋๋ค. Snowflake๊ฐ ๊ฐ์ฒํ ๋ฉํฐ ํด๋ฌ์คํฐ ๊ณต์ ๋ฐ์ดํฐ(multi-cluster shared data) ์ค๊ณ๋ ์คํ ๋ฆฌ์ง, ์ปดํจํธ, ์๋น์ค๋ฅผ ์ธ ๊ฐ์ ๋ ๋ฆฝ๋ ๊ณ์ธต์ผ๋ก ๋ถ๋ฆฌํ๋ฉฐ, ์ด ๋ถ๋ฆฌ๊ฐ ํ์ด ํ๋ซํผ ์์์ ๋ด๋ฆฌ๋ ๊ฑฐ์ ๋ชจ๋ ์ฑ๋ฅ๊ณผ ๋น์ฉ ๊ด๋ จ ๊ฒฐ์ ์ ์ค๋ช ํฉ๋๋ค. ์ด ๊ฐ์ด๋๋ Snowflake ์ํคํ ์ฒ, 2026๋ ์๋ ์ฟผ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ณ ์ ๋ ดํ๊ฒ ์ ์งํ๋ SQL ํจํด, ๊ทธ๋ฆฌ๊ณ ์ค์ ํ๋ก๋์ ๊ฒฝํ์ ๋๋ฌ๋ด๋ ๋ฉด์ ์ง๋ฌธ์ ๋ค๋ฃน๋๋ค.
Snowflake๋ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค๋ฅผ ์ธ ๊ฐ์ ๋ ๋ฆฝ๋ ๊ณ์ธต์ผ๋ก ๋๋๋๋ค. ์์ถ๋ ์ปฌ๋ผํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ ์ค์ ์ง์ค์ ์คํ ๋ฆฌ์ง, ํ๋ ฅ์ ์ธ ์ปดํจํธ๋ฅผ ์ ๊ณตํ๋ virtual warehouse, ๊ทธ๋ฆฌ๊ณ ๋ฉํ๋ฐ์ดํฐ์ ๋ณด์, ์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ๋ด๋นํ๋ ํด๋ผ์ฐ๋ ์๋น์ค ๊ณ์ธต์ ๋๋ค. ๊ฐ ๊ณ์ธต์ ๋ค๋ฅธ ๊ณ์ธต์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅ๋ฉ๋๋ค.
Snowflake ์ํคํ ์ฒ: ์คํ ๋ฆฌ์ง, ์ปดํจํธ, ํด๋ผ์ฐ๋ ์๋น์ค
Snowflake ์ํคํ ์ฒ์ ๊ฐ์ฅ ํฐ ํน์ง์ ์คํ ๋ฆฌ์ง์ ์ปดํจํธ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค๋ ์ ์ ๋๋ค. ๋ฐ์ดํฐ๋ Amazon S3๋ Azure Blob Storage ๊ฐ์ ํด๋ผ์ฐ๋ ์ค๋ธ์ ํธ ์คํ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ค์ ์ง์ค์ ์คํ ๋ฆฌ์ง ๊ณ์ธต์ ๋จ ํ ๋ฒ๋ง ์ ์ฅ๋ฉ๋๋ค. ์์์ ๊ฐ์์ ์ปดํจํธ ํด๋ฌ์คํฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ๋ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฝ์ ์ ์์ผ๋ฉฐ, ์ด ๋ฐฉ์์ ์๋ ์์ง๋์ด๋ง ํ์ด 2016๋ SIGMOD ๋ ผ๋ฌธ์์ ์ค๊ณ๋ฅผ ์๊ฐํ๋ฉฐ multi-cluster shared data๋ผ๊ณ ๋ช ๋ช ํ ์ ๊ทผ๋ฒ์ ๋๋ค.
์คํ ๋ฆฌ์ง ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฅผ micro-partition์ด๋ผ ๋ถ๋ฆฌ๋ ๋ถ๋ณ์, ์์ถ๋ ์ปฌ๋ผํ ํ์ผ๋ก ๋ณด๊ดํฉ๋๋ค. ์ฌ์ฉ์๋ ์ด ํ์ผ๋ค์ ์ง์ ๊ด๋ฆฌํ์ง ์์ต๋๋ค. Snowflake๊ฐ ํ์ผ์ ๊ธฐ๋กํ๊ณ , ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ๋ฉฐ, ํ์ํฉ๋๋ค. ์ปดํจํธ ๊ณ์ธต์ virtual warehouse๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ virtual warehouse๋ Snowflake๊ฐ ์์ฒญ์ ๋ฐ๋ผ ํ๋ก๋น์ ๋ํ๋ ์๋ฒ ํด๋ฌ์คํฐ์ ๋๋ค. ํด๋ผ์ฐ๋ ์๋น์ค ๊ณ์ธต์ ๋ ๊ณ์ธต ์์ ์๋ฆฌ ์ก๊ณ ๋ชจ๋ ๊ฒ์ ์กฐ์จํฉ๋๋ค. SQL์ ํ์ฑํ๊ณ , ์ฟผ๋ฆฌ๋ฅผ ๊ณํํ๋ฉฐ, ์ ๊ทผ ์ ์ด๋ฅผ ๊ฐ์ ํ๊ณ , ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๋ฉฐ, Time Travel์ด๋ zero-copy cloning ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด ๊ณ์ธต๋ค์ด ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ warehouse๋ ๋ฐ์ดํฐ์ ๋จ 1๋ฐ์ดํธ๋ ๊ฑด๋๋ฆฌ์ง ์๊ณ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ผ๋ฉฐ, ์คํ ๋ฆฌ์ง๋ ์ปดํจํธ๋ฅผ ์ ํ ํ๋ก๋น์ ๋ํ์ง ์๊ณ ๋ ํํ๋ฐ์ดํธ ๊ท๋ชจ๋ก ๋์ด๋ ์ ์์ต๋๋ค.
-- setup_warehouse.sql
-- Create an isolated compute cluster and a database.
CREATE WAREHOUSE analytics_wh
WAREHOUSE_SIZE = 'MEDIUM' -- 4 credits/hour, doubles each size step
AUTO_SUSPEND = 60 -- suspend after 60s idle to stop billing
AUTO_RESUME = TRUE -- resume automatically on the next query
INITIALLY_SUSPENDED = TRUE;
CREATE DATABASE sales_analytics;
USE WAREHOUSE analytics_wh;
USE DATABASE sales_analytics;
-- Storage and compute are independent: dropping the warehouse
-- leaves every table in sales_analytics untouched.์ด ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ๋ค analytics_wh๋ฅผ ์ญ์ ํ๋ฉด ๋ชจ๋ ์ปดํจํธ ๊ณผ๊ธ์ด ์ค๋จ๋์ง๋ง, ์ warehouse๊ฐ ์์ฑ๋๋ ์ฆ์ ๋ชจ๋ ํ
์ด๋ธ์ ๊ทธ๋๋ก ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค. ์ด ๋์ปคํ๋ง์ด์ผ๋ง๋ก ๋ฉด์ ์์ ๋ช
ํํ๊ฒ ์ค๋ช
ํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
์
๋๋ค.
Virtual Warehouse๊ฐ Snowflake ์ปดํจํธ๋ฅผ ํ์ฅํ๋ ๋ฐฉ์
virtual warehouse๋ X-Small, Small, Medium, Large ๋ฑ ํฐ์ ์ธ ์ฌ์ด์ฆ ๋จ์๋ก ํฌ๊ธฐ๋ฅผ ์ ํ๋ ์ด๋ฆ ๋ถ์ ์ปดํจํธ ํด๋ฌ์คํฐ์ ๋๋ค. ํ ๋จ๊ณ ์ฌ๋ผ๊ฐ ๋๋ง๋ค ์๋ฒ ์์ ์๊ฐ๋น ํฌ๋ ๋ง ์๋น๋์ด ๋ชจ๋ ๋ ๋ฐฐ๊ฐ ๋๋ฏ๋ก, Large warehouse๋ Small๋ณด๋ค ๋ค ๋ฐฐ ๋น์ธ์ง๋ง ์ค์บ์ด ๋ง์ ์ฟผ๋ฆฌ๋ฅผ ๋๋ต ๋ค ๋ฐฐ ๋น ๋ฅด๊ฒ ๋๋ ๋๋ค. ์ด ์ ํ์ ์ธ ๊ฐ๊ฒฉ ๋๋น ์ฑ๋ฅ ๊ด๊ณ๋, ๊ฐ์ฅ ์ ๋ ดํ ์ ํ์ด ์ข ์ข ๋ ์งง์ ์๊ฐ ๋์ ์คํ๋๋ ๋ ํฐ warehouse๋ผ๋ ์๋ฏธ์ ๋๋ค.
๋ ๊ฐ์ง ํ์ฅ ์ฐจ์์ด ์กด์ฌํ๋ฉฐ, ์ด ๋์ ํผ๋ํ๋ ๊ฒ์ ํํ ๋ฉด์ ํจ์ ์ ๋๋ค. ์์ง ํ์ฅ์ ๋จ์ผ warehouse์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ญ๋๋ค. ์ํ ํ์ฅ์ multi-cluster warehouse์ ํด๋ฌ์คํฐ๋ฅผ ์ถ๊ฐํด ๋ ๋ง์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ค์ 9์์ ์ ๋๋ฆฌ์คํธ 200๋ช ์ด ๋ชฐ๋ฆฌ๋ ๋์๋ณด๋์๋ ๋ ํฐ warehouse๊ฐ ์๋๋ผ ๋ ๋ง์ ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , ์กฐ ๋จ์ ํ์ ์ผ๊ฐ ๋ฐฑํ์๋ ๋ ๋ง์ ํด๋ฌ์คํฐ๊ฐ ์๋๋ผ ๋ ํฐ warehouse๊ฐ ํ์ํฉ๋๋ค.
๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ค์บํ๋ ํ๋์ ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ค๋ฉด warehouse์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค(์์ง). ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํด ์์ฒญ์ด ๋๊ธฐ์ด์ ์์ด๊ธฐ ์์ํ๋ฉด multi-cluster warehouse์ ํด๋ฌ์คํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค(์ํ). ์ ์๋ ๋ฌด๊ฑฐ์ด ์์ ์ ์ง์ฐ ์๊ฐ์ ํด๊ฒฐํ๊ณ , ํ์๋ ๋ค์์ ์์ ์์ ์ ๋์์ฑ์ ํด๊ฒฐํฉ๋๋ค.
-- scale_compute.sql
-- Multi-cluster warehouse: add clusters when concurrency rises and
-- remove them when demand falls. Each cluster is a separate MEDIUM engine.
ALTER WAREHOUSE analytics_wh SET
MIN_CLUSTER_COUNT = 1
MAX_CLUSTER_COUNT = 4 -- up to 4 clusters during peak load
SCALING_POLICY = 'STANDARD'; -- favor performance over credit savings
-- Resize vertically for one heavy job, then shrink back afterward.
ALTER WAREHOUSE analytics_wh SET WAREHOUSE_SIZE = 'XLARGE';
-- ... run the heavy backfill ...
ALTER WAREHOUSE analytics_wh SET WAREHOUSE_SIZE = 'MEDIUM';์ด๊ฒ์ ๊ฒฝ์ ์ ์ผ๋ก ๋ง๋๋ ์์๋ AUTO_SUSPEND์ AUTO_RESUME์
๋๋ค. ์ผ์ ์ค๋จ๋ warehouse๋ ๋น์ฉ์ด ์ ํ ๋ค์ง ์์ผ๋ฉฐ, Snowflake๋ ์ต์ 60์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด ๋จ์๋ก ๊ณผ๊ธํฉ๋๋ค. ๋ํํ warehouse์ ์งง์ auto-suspend๋ฅผ ์ค์ ํ๋ฉด ์ ํด ํด๋ฌ์คํฐ๊ฐ ์ฟผ๋ฆฌ ์ฌ์ด์ ํฌ๋ ๋ง์ ๋ญ๋นํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋น ๋ฅธ SQL์ ์ํ Micro-Partition๊ณผ Clustering Key
Snowflake๋ ๋ชจ๋ ํ ์ด๋ธ์ micro-partition์ ์งํฉ์ผ๋ก ์ ์ฅํ๋ฉฐ, ๊ฐ micro-partition์ ์์ถ๋์ง ์์ ๊ธฐ์ค์ผ๋ก 50~500MB์ ๋ฐ์ดํฐ๋ฅผ ์ปฌ๋ผํ ํฌ๋งท์ผ๋ก ๋ด์ต๋๋ค. ๋ชจ๋ micro-partition์ ๋ํด Snowflake๋ ๊ฐ ์ปฌ๋ผ์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๋ฉํ๋ฐ์ดํฐ์ ๊ธฐ๋กํฉ๋๋ค. ์ฟผ๋ฆฌ๊ฐ ํน์ ์ปฌ๋ผ์ผ๋ก ํํฐ๋งํ๋ฉด ์ตํฐ๋ง์ด์ ๊ฐ ๊ทธ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ๊ฐ ๋ฒ์๊ฐ ์ผ์นํ ์ ์๋ ํํฐ์ ์ ๊ฑด๋๋ฐ๋๋ฐ, ์ด ๊ณผ์ ์ partition pruning์ด๋ผ๊ณ ํฉ๋๋ค. ์ด๊ฒ์ด Snowflake์ ์๋ ์ธ๋ฑ์ค๊ฐ ํ์ ์๋ ์ด์ ์ ๋๋ค. pruning์ ๋ชจ๋ ์ปฌ๋ผ์์ ์๋์ผ๋ก ์ผ์ด๋ฉ๋๋ค.
pruning์ ํํฐ ์ปฌ๋ผ์ด ๋ฐ์ดํฐ๊ฐ ์ ์ฌ๋ ์์์ ์๊ด๊ด๊ณ๊ฐ ์์ ๋ ๊ฐ์ฅ ์ ์๋ํฉ๋๋ค. ๋ ์ง์์ผ๋ก ์์ง๋ ํ ์ด๋ธ์ ๋ ์ง ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก pruningํฉ๋๋ค. ํฐ ํ ์ด๋ธ์ด ์ ์ฌ ์์์ ๋ฌด๊ดํ ์ปฌ๋ผ์ผ๋ก ์์ฃผ ํํฐ๋ง๋ ๋๋, clustering key๊ฐ ๊ด๋ จ๋ ํ๋ค์ ์ฌ๋ฌ micro-partition์ ๊ฑธ์ณ ํจ๊ป ๋ฐฐ์นํด ํ ์ด๋ธ์ด ์ปค์ ธ๋ pruning์ด ๊ณ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ง๋๋๋ก ํฉ๋๋ค.
-- clustering.sql
-- Filters on naturally ordered columns prune partitions with no index.
SELECT order_date, SUM(amount_usd) AS revenue
FROM orders
WHERE order_date BETWEEN '2026-01-01' AND '2026-03-31'
GROUP BY order_date;
-- For a multi-terabyte table queried by a non-load-order column,
-- a clustering key co-locates related rows to keep pruning effective.
ALTER TABLE orders CLUSTER BY (customer_region, order_date);
-- Inspect clustering depth before committing to a key.
SELECT SYSTEM$CLUSTERING_INFORMATION('orders', '(customer_region, order_date)');clustering key๋ ๊ณต์ง๊ฐ ์๋๋๋ค. Snowflake๋ ์ด๋ฅผ ์ ์งํ๊ธฐ ์ํด ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค๋ฅผ ์คํํ๋ฉฐ, ์ด ์๋น์ค๋ ํฌ๋ ๋ง์ ์๋นํฉ๋๋ค. ๊ฒฝํ์น์ ์ฟผ๋ฆฌ ํ๋กํ์ผ์ด pruning์ด ๋ถ์คํจ์ ๋ณด์ฌ์ฃผ๋ ํ ๋ผ๋ฐ์ดํธ ๊ท๋ชจ์ ํ ์ด๋ธ์๋ง clustering key๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๋ ์์ ํ ์ด๋ธ์ ์ค์ค๋ก pruning์ด ์ ๋๋ฉฐ, ์ฑ๊ธํ clustering key๋ ๋์ ๋ญ๋นํฉ๋๋ค. ์ด ํธ๋ ์ด๋์คํ๋ฅผ ์ค๋ช ํ๋ ๋ฅ๋ ฅ์ด ์ฃผ๋์ด์ ์๋์ด์ ๋ต๋ณ์ ๊ฐ๋ฅด๋ ์ฐจ์ด๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ฝ์ ๊ณผ ๊ฐฑ์ ์ด ์ฆ์ ํ ์ด๋ธ์์๋ ์๋ reclustering ์๋น์ค๊ฐ clustering key๋ฅผ ์ ์งํ๊ธฐ ์ํด micro-partition์ ์ง์์ ์ผ๋ก ์ฌ๊ตฌ์ฑํ๋ฉฐ, ์ด ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฐ์ํ๋ ค๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋ ๋ง์ ํฌ๋ ๋ง์ ํ์ธ ์ ์์ต๋๋ค. ๋จผ์ ์ฟผ๋ฆฌ ํ๋กํ์ผ๋ก ์ฟผ๋ฆฌ ์ํฌ๋ก๋๋ฅผ ์ธก์ ํ๊ณ , clustering์ ์ฐ๊ธฐ๋ณด๋ค ์ฝ๊ธฐ๊ฐ ํจ์ฌ ๋ง์ ํ ์ด๋ธ์๋ง ์ฌ์ฉํ์ญ์์ค.
๋ฐ์ดํฐ ์ ์ฌ์ ๋ณํ: Snowpipe, Stream, Dynamic Table
์ธ ๊ฐ์ง ์์ง ํจํด์ด ๋๋ถ๋ถ์ ์ํฌ๋ก๋๋ฅผ ์ปค๋ฒํฉ๋๋ค. ๋ฒํฌ COPY INTO๋ ์คํ
์ด์ง๋ ํ์ผ์ ๋จ์ผ ๋ช
๋ น์ผ๋ก ์ ์ฌํ๋ฉฐ ์์ฝ๋ ๋ฐฐ์น ์์
์ ์ ํฉํฉ๋๋ค. Snowpipe๋ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ์ด๋ฒคํธ๋ก ํธ๋ฆฌ๊ฑฐ๋์ด ์๋ฒ๋ฆฌ์ค ๋ง์ดํฌ๋ก๋ฐฐ์น๋ก ํ์ผ์ ์ง์์ ์ผ๋ก ์ ์ฌํ๋ฉฐ ์ค์ค์๊ฐ ๋์ฐฉ์ ์ ํฉํฉ๋๋ค. Snowpipe Streaming์ 1์ด ๋ฏธ๋ง์ ์ ์ ๋๊ฐ ์ค์ํ ๋ ์ ์ง์ฐ API๋ฅผ ํตํด ๊ฐ๋ณ ํ์ ๋ฐ์ด ๋ฃ์ต๋๋ค. ์ง์ฐ ์๊ฐ๊ณผ ํ์ผ ํฌ๊ธฐ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ด ์ค์์ ์ ํํ๋ ๊ฒ์ ์์ฃผ ๋์ค๋ ๋ฉด์ ์ง๋ฌธ์ด๋ฉฐ, ์ฌ๋ฐ๋ฅธ ๋ต์ "๋ค์ด์คํธ๋ฆผ ์๋น์๊ฐ ์ค์ ๋ก ํ์๋ก ํ๋ ์ ์ ๋์ ๋ฌ๋ ค ์๋ค"๋ก ์์ํฉ๋๋ค.
warehouse ๋ด๋ถ์ ๋ณํ์ ์ญ์ฌ์ ์ผ๋ก Stream๊ณผ Task์ ์์กดํด ์์ต๋๋ค. Stream์ ํ ์ด๋ธ์ ํ ๋จ์ ๋ณ๊ฒฝ(change data capture)์ ์บก์ฒํ๊ณ , Task๋ ์์ฝ๋ ์ผ์ ์ ๋ฐ๋ผ SQL์ ์คํํด ๊ทธ ๋ณ๊ฒฝ์ ์๋นํ๊ณ ๋ค์ด์คํธ๋ฆผ์ผ๋ก ๋ณํฉํฉ๋๋ค.
-- incremental_pipeline.sql
-- A stream tracks row-level changes (CDC) on the raw landing table.
CREATE STREAM orders_stream ON TABLE raw_orders;
-- A task consumes the stream on a schedule and merges changes downstream.
CREATE TASK refresh_orders
WAREHOUSE = analytics_wh
SCHEDULE = '5 MINUTE'
WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
AS
MERGE INTO orders t
USING orders_stream s ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET t.amount_usd = s.amount_usd
WHEN NOT MATCHED THEN INSERT (order_id, amount_usd)
VALUES (s.order_id, s.amount_usd);2026๋ ์๋ Dynamic Tables๊ฐ ์ฆ๋ถ ๋ณํ์ ํํํ๋ ์ ํธ๋๋ ๋ฐฉ์์ด ๋์์ต๋๋ค. Stream์ Task์ ์ฐ๊ฒฐํ๊ณ ๋ณํฉ์ ์ง์ ์์ฑํ๋ ๋์ , Dynamic Table์ ๋ชฉํ ์ง์ฐ(target lag)๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ ์ธํ๋ฉด Snowflake๊ฐ ์ฆ๋ถ ๊ฐฑ์ ์ ์๋์ผ๋ก ๊ณ์ฐํฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ์ ์ ํ๊ฒ ์ ์งํ๋ฉด์ ๋๋ถ๋ถ์ ์ค์ผ์คํธ๋ ์ด์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
-- dynamic_table.sql
-- Dynamic Tables replace the stream + task pattern with a declarative
-- target lag. Snowflake computes the incremental refresh automatically.
CREATE DYNAMIC TABLE daily_revenue
TARGET_LAG = '5 minutes'
WAREHOUSE = analytics_wh
AS
SELECT order_date, SUM(amount_usd) AS revenue
FROM orders
GROUP BY order_date;์คํ ํฌ๋งท ์์์ ๊ตฌ์ถํ๋ ํ์ ์ํด, Snowflake์ Iceberg ํ ์ด๋ธ์ warehouse๊ฐ ๊ณ ๊ฐ ์์ ์ ํด๋ผ์ฐ๋ ๋ฒํท์ ์ ์ฅ๋ Apache Iceberg ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๊ฒ ํ์ฌ, Snowflake์ ์ฟผ๋ฆฌ ์์ง๊ณผ ๊ฑฐ๋ฒ๋์ค๋ฅผ ์ ์งํ๋ฉด์๋ ์ข ์์ ํผํฉ๋๋ค. ๋ง์ ํ์ ๋ฒ์ ๊ด๋ฆฌ๋๊ณ ํ ์คํธ๋ ๋ณํ์ ์ํด Snowflake๋ฅผ dbt์ ๊ฒฐํฉํ๋๋ฐ, ์ด ์ํฌํ๋ก๋ dbt ๋ฐ์ดํฐ ๋ณํ ๋ฐ ํ ์คํธ ๊ฐ์ด๋์์ ๋ค๋ฃน๋๋ค.
Data Engineering ๋ฉด์ ์ค๋น๊ฐ ๋์ จ๋์?
์ธํฐ๋ํฐ๋ธ ์๋ฎฌ๋ ์ดํฐ, flashcards, ๊ธฐ์ ํ ์คํธ๋ก ์ฐ์ตํ์ธ์.
๋ฐ์ดํฐ ์์ง๋์ด๋ฅผ ์ํ Snowflake ๋ฉด์ ์ง๋ฌธ
์๋ ์ง๋ฌธ๋ค์ Snowflake ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๋ฉด์ ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฑ์ฅํฉ๋๋ค. ๊ฐํ ๋ต๋ณ์ ๋ฌธ๋ฒ์ ์์กํ๊ธฐ๋ณด๋ค ๊ธฐ๋ฅ์ ์คํ ๋ฆฌ์ง-์ปดํจํธ ๋ถ๋ฆฌ์ ์ฐ๊ฒฐํฉ๋๋ค.
์คํ ๋ฆฌ์ง์ ์ปดํจํธ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์? ๊ฒฝํฉ์ ์ ๊ฑฐํฉ๋๋ค. ๋์๋ณด๋๋ฅผ ์คํํ๋ ์ ๋๋ฆฌ์คํธ, ํผ์ฒ๋ฅผ ํ์ต์ํค๋ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๋ ELT ์์ ์ด ๊ฐ์ ์์ ์ warehouse์์ ๋์ผํ ํ ์ด๋ธ์ ๋์์ผ๋ก, ์์์ ๋๊ณ ๊ฒฝ์ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ์คํํ ์ ์์ต๋๋ค. ์ปดํจํธ๋ ๋ฌด๊ฑฐ์ด ์์ ์ ์ํด ํ์ฅ๋๊ณ ์ ํด ์ํ์์๋ ์ผ์ ์ค๋จ๋๋ ๋ฐ๋ฉด, ์คํ ๋ฆฌ์ง ๋น์ฉ์ ์ฐ๊ฒฐ๋ ์ปดํจํธ ์๊ณผ ๋ฌด๊ดํ๊ฒ ์ผ์ ํ๊ฒ ์ ์ง๋ฉ๋๋ค.
Time Travel๊ณผ zero-copy cloning์ ์ด๋ป๊ฒ ์๋ํ๋์? ๋ ๋ค micro-partition์ ๋ถ๋ณ์ฑ์ ์์กดํฉ๋๋ค. Snowflake๋ micro-partition์ ์ ๋ ๋ฎ์ด์ฐ์ง ์๊ธฐ ๋๋ฌธ์, ์ด์ ๋ฒ์ ์ ๋ณด์กด ๊ธฐ๊ฐ(Enterprise์์๋ ์ต๋ 90์ผ) ๋์ ๋์คํฌ์ ๋จ์ ์์ต๋๋ค. Time Travel์ ๊ทธ ์ด์ ํํฐ์
์ ๊ฐ๋ฆฌ์ผ ๊ณผ๊ฑฐ ํ์์คํฌํ ๊ธฐ์ค์ผ๋ก ํ
์ด๋ธ์ ์ฟผ๋ฆฌํ๊ณ , CLONE์ ์ด๋ ํ์ชฝ์ด ์์ ๋๊ธฐ ์ ๊น์ง ์คํ ๋ฆฌ์ง๋ฅผ ๋ณต์ ํ์ง ์๊ณ ๋์ผํ ํํฐ์
์ ์ฐธ์กฐํ๋ ์ ํ
์ด๋ธ์ ์์ฑํฉ๋๋ค. copy-on-write๊ฐ ํํ๋ฐ์ดํธ ํ
์ด๋ธ์ ํด๋ก ์ ์ฆ๊ฐ์ ์ด๊ณ ๊ฑฐ์ ๋ฌด๋ฃ๋ก ๋ง๋๋ ์์์
๋๋ค.
clustering key๋ ์ธ์ ์ ์ํด์ผ ํ๋์? ์ ์ฌ ์์์ ๋ฌด๊ดํ ์ปฌ๋ผ์ผ๋ก ์์ฃผ ํํฐ๋ง๋๊ฑฐ๋ ์กฐ์ธ๋๋ ํฐ ํ ์ด๋ธ(๋๋ต 1ํ ๋ผ๋ฐ์ดํธ ์ด์)์์๋ง, ๊ทธ๋ฆฌ๊ณ ์ฟผ๋ฆฌ ํ๋กํ์ผ์ด ๋ถ์คํ pruning์ ํ์ธํ ๋ค์๋ง ์ ์ํฉ๋๋ค. clustering์ ์ง์์ ์ธ ์ ์ง ๊ด๋ฆฌ ํฌ๋ ๋ง ๋น์ฉ์ ๋ฐ์์ํค๋ฏ๋ก, ๊ธฐ๋ณธ๊ฐ์ด ์๋๋ผ ์๋์ ์ธ ์ต์ ํ์ ๋๋ค.
Snowflake ๋น์ฉ์ ์ด๋ป๊ฒ ํต์ ํ๋์? warehouse ํฌ๊ธฐ ์กฐ์ , ๊ณต๊ฒฉ์ ์ธ auto-suspend, ์ค์ ๋์์ฑ์ ๋ง์ถ ํด๋ฌ์คํฐ ์, ๊ทธ๋ฆฌ๊ณ ํฌ๋ ๋ง ์ง์ถ์ ์ํ์ ๋๋ resource monitor๋ฅผ ํตํด์์ ๋๋ค. resource monitor๋ ํ ๋น๋์ ๋๋ฌํ๋ฉด ์๋์ผ๋ก ์๋ฆผ์ ๋ณด๋ด๊ฑฐ๋ warehouse๋ฅผ ์ผ์ ์ค๋จํ ์ ์์ต๋๋ค.
-- cost_control.sql
-- A resource monitor caps credit spend and suspends warehouses
-- automatically when the monthly quota is reached.
CREATE RESOURCE MONITOR monthly_cap
WITH CREDIT_QUOTA = 1000
FREQUENCY = MONTHLY
START_TIMESTAMP = IMMEDIATELY
TRIGGERS
ON 80 PERCENT DO NOTIFY
ON 100 PERCENT DO SUSPEND;
ALTER WAREHOUSE analytics_wh SET RESOURCE_MONITOR = monthly_cap;Stream๊ณผ Task๋ฅผ ์ธ๊น์, ์๋๋ฉด Dynamic Table์ ์ธ๊น์? Dynamic Table์ ๋ชฉํ ์ ์ ๋๊ฐ ์๊ตฌ์ฌํญ์ด๊ณ Snowflake๊ฐ ๊ฐฑ์ ์ ๊ด๋ฆฌํ ์ ์๋ ์ ์ธ์ ํ์ดํ๋ผ์ธ์ ์ ํฉํฉ๋๋ค. Stream๊ณผ Task๋ ๋ณํ์ ๋ช ๋ นํ ์ ์ด, ๋ถ์์ฉ, ๋๋ ๋จ์ผ ์ฟผ๋ฆฌ๋ก ํํํ ์ ์๋ ๋ก์ง์ด ํ์ํ ๋ ์ฌ์ ํ ์ฌ๋ฐ๋ฅธ ๋๊ตฌ์ ๋๋ค. ํ๋๋ก ๊ธฐ๋ณธ ์ค์ ํ์ง ์๊ณ ๊ฐ๊ฐ์ด ์ด๋์ ๋ง๋์ง ์๋ ๊ฒ์ด ํ๋ก๋์ ๊ฒฝํ์ ๋๋ฌ๋ ๋๋ค.
Snowflake์ ELT๋ ์ ํต์ ์ธ ETL๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์? Snowflake์ ์ ๋ ดํ ์คํ ๋ฆฌ์ง์ ํ๋ ฅ์ ์ธ ์ปดํจํธ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ ์ฌํ๊ณ ๊ทธ ์๋ฆฌ์์ ๋ณํํ๋ ๊ฒ์ ์ค์ฉ์ ์ผ๋ก ๋ง๋๋๋ฐ, ์ด๋ ETL ๋ ELT ์ํคํ ์ฒ ๊ฐ์ด๋์์ ํ๊ตฌํ๋ ํจํด์ ๋๋ค. ์ ์ฒด ํ๋ฆ์ ์ค๋นํ๋ ์ง์์๋ ๋ ๋์ ๋ฐ์ดํฐ ์์ง๋์ด๋ง ํธ๋๊ณผ ํจ๊ป ETL ๋ฐ ELT ํจํด ๋ชจ๋์ ํ๋ จํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
- Snowflake ์ํคํ ์ฒ๋ ์คํ ๋ฆฌ์ง, ์ปดํจํธ, ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ธ ๊ฐ์ ๋ ๋ฆฝ๋ ๊ณ์ธต์ผ๋ก ๋ถ๋ฆฌํ๋ฉฐ, ๊ฑฐ์ ๋ชจ๋ ์ค๊ณ ๊ด๋ จ ๋ต๋ณ์ ๊ทธ ๋ถ๋ฆฌ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋๋ค
- virtual warehouse๋ ๋ ๋ฌด๊ฑฐ์ด ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์ํด ์์ง์ผ๋ก, ๋ ๋์ ๋์์ฑ์ ์ํด ์ํ์ผ๋ก ํ์ฅํ๋ฉฐ, auto-suspend์ ์ด ๋จ์ ๊ณผ๊ธ์ ์ ํด ์ปดํจํธ๋ฅผ ๋ฌด๋ฃ๋ก ์ ์งํฉ๋๋ค
- ์ปฌ๋ผ๋ณ min/max ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง micro-partition์ ์๋ partition pruning์ ์ ๊ณตํ๋ฉฐ, ์ด๊ฒ์ด Snowflake์ ์๋ ์ธ๋ฑ์ค๊ฐ ํ์ ์๋ ์ด์ ์ ๋๋ค
- clustering key๋ pruning ๋ถ์ค์ด ์ ์ฆ๋ ํ ๋ผ๋ฐ์ดํธ ๊ท๋ชจ์ ํ ์ด๋ธ์๋ง ์ถ๊ฐํ์ญ์์ค. ์ ์ง ๊ด๋ฆฌ๊ฐ ํฌ๋ ๋ง์ ์๋นํ๊ธฐ ๋๋ฌธ์ ๋๋ค
- ์์ง ํจํด์ ํ์ํ ์ ์ ๋์ ๋ง์ถ์ญ์์ค. ๋ฐฐ์น์๋ ๋ฒํฌ COPY, ์ง์์ ์ธ ๋ง์ดํฌ๋ก๋ฐฐ์น์๋ Snowpipe, 1์ด ๋ฏธ๋ง์ ์ง์ฐ์๋ Snowpipe Streaming์ ์ฌ์ฉํฉ๋๋ค
- 2026๋ ์๋ ์ ์ธ์ ์ฆ๋ถ ๋ณํ์ Dynamic Tables๋ฅผ ์ฐ์ ํ๊ณ , Stream๊ณผ Task๋ ๋ช ๋ นํ ๋ก์ง์ ์ํด ๋จ๊ฒจ ๋์ญ์์ค
- Time Travel๊ณผ zero-copy cloning์ ๋ชจ๋ micro-partition์ ๋ถ๋ณ์ฑ๊ณผ copy-on-write๋ฅผ ํ์ฉํด ์์ ์ฟผ๋ฆฌ์ ์ฆ๊ฐ์ ์ธ ํด๋ก ์ ์ ๋ ดํ๊ฒ ๋ง๋ญ๋๋ค
- ์ ์ ํฌ๊ธฐ์ warehouse, ๊ณต๊ฒฉ์ ์ธ auto-suspend, ๋์์ฑ์ ๋ง์ถ ํด๋ฌ์คํฐ, resource monitor๋ก ๋น์ฉ์ ํต์ ํ์ญ์์ค
์ฐ์ต์ ์์ํ์ธ์!
๋ฉด์ ์๋ฎฌ๋ ์ดํฐ์ ๊ธฐ์ ํ ์คํธ๋ก ์ง์์ ํ ์คํธํ์ธ์.
ํ๊ทธ
๊ณต์
๊ด๋ จ ๊ธฐ์ฌ

dbt 2026 ์๋ฒฝ ๊ฐ์ด๋: ๋ฐ์ดํฐ ๋ณํ, ํ ์คํธ ์ ๋ต, ๋ฉด์ ์ง๋ฌธ ์ด์ ๋ฆฌ
dbt๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ๋ณํ์ ํต์ฌ ๊ฐ๋ ๋ถํฐ ์ค๋ฌด๊น์ง, ๋ ์ด์ด๋ ๋ชจ๋ธ๋ง, ์ธํฌ๋ฆฌ๋ฉํ ์ ๋ต, ํ ์คํธ ๋ฐฉ๋ฒ๋ก , ๊ทธ๋ฆฌ๊ณ 2026๋ ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ ์ง๋ฌธ์ ์ฝ๋ ์์ ์ ํจ๊ป ์์ธํ ๋ค๋ฃน๋๋ค.

2026๋ ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๋ฉด์ ์ง๋ฌธ ์์ 25๊ฐ
2026๋ ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๋ฉด์ ์์ ๊ฐ์ฅ ๋ง์ด ์ถ์ ๋๋ 25๊ฐ์ง ํต์ฌ ์ง๋ฌธ๊ณผ ์ค๋ฌด ์ค์ฌ์ ๋ต๋ณ์ ์ ๊ณตํฉ๋๋ค.

2026๋ Apache Spark 4 ์๋ฒฝ ๊ฐ์ด๋: ์ ๊ท ๊ธฐ๋ฅ, Structured Streaming, ๋ฉด์ ์ง๋ฌธ
Apache Spark 4์ ํต์ฌ ์ ๊ท ๊ธฐ๋ฅ์ธ ANSI SQL ๋ชจ๋, VARIANT ๋ฐ์ดํฐ ํ์ , ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋, Spark Connect๋ฅผ ์ฌ์ธต ๋ถ์ํฉ๋๋ค. ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๋ฉด์ ์ ์ํ ํ์ ์ง๋ฌธ๊ณผ ๋ต๋ณ๋ ํจ๊ป ์ ๊ณตํฉ๋๋ค.