snowflake9 phút đọc
Mô hình hóa dữ liệu Snowflake: Star Schema, Clustering và Tối ưu Chi phí
Best practices thiết kế data warehouse Snowflake — star schema, clustering keys, materialized views, warehouse sizing và tối ưu credit.
V
Bởi Ventra Rocket#Snowflake#Data Warehouse#SQL#Star Schema#Data Modeling
Snowflake tách biệt compute và storage, thay đổi cách suy nghĩ về data modeling so với database truyền thống.
1. Star Schema — Nền tảng
Star schema giảm độ phức tạp join và tối ưu result caching.
CREATE TABLE fact_orders (
order_id NUMBER PRIMARY KEY,
order_date_id NUMBER REFERENCES dim_date(date_id),
customer_id NUMBER REFERENCES dim_customer(customer_id),
product_id NUMBER REFERENCES dim_product(product_id),
quantity NUMBER,
total_amount FLOAT
)
CLUSTER BY (order_date_id);
CREATE TABLE dim_customer (
customer_id NUMBER PRIMARY KEY,
full_name VARCHAR(200),
email VARCHAR(200),
country VARCHAR(100),
segment VARCHAR(50),
is_current BOOLEAN DEFAULT TRUE
);
2. Clustering Keys
-- Time-series: cluster theo ngày
ALTER TABLE fact_orders CLUSTER BY (order_date_id);
-- Multi-dimension: cột filter nhiều nhất đứng đầu
ALTER TABLE fact_events CLUSTER BY (event_date, event_type);
-- Kiểm tra clustering depth (tối ưu: 1-4)
SELECT SYSTEM$CLUSTERING_DEPTH('fact_orders', '(order_date_id)');
3. Materialized Views
CREATE MATERIALIZED VIEW mv_daily_revenue AS
SELECT
d.year, d.month, c.country,
COUNT(DISTINCT o.customer_id) AS unique_customers,
SUM(o.total_amount) AS revenue
FROM fact_orders o
JOIN dim_date d ON o.order_date_id = d.date_id
JOIN dim_customer c ON o.customer_id = c.customer_id
GROUP BY 1, 2, 3;
4. Sizing Virtual Warehouse
| Kích thước | Credits/Giờ | Dùng cho | |-----------|------------|---------| | XS | 1 | Dev, query nhỏ | | S | 2 | Production nhẹ | | M | 4 | Analytics chuẩn | | L | 8 | Join phức tạp | | XL | 16 | ETL, load data |
CREATE WAREHOUSE analytics_wh
WAREHOUSE_SIZE = MEDIUM
AUTO_SUSPEND = 300
AUTO_RESUME = TRUE
MAX_CLUSTER_COUNT = 3;
5. Tối ưu Chi phí
-- Zero-copy cloning — không tốn storage cho data không đổi
CREATE TABLE orders_test CLONE fact_orders;
-- Time travel để debug
SELECT * FROM fact_orders AT (OFFSET => -7200); -- 2 giờ trước
-- Kiểm tra cache hit (zero credit)
SELECT query_text FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE partitions_scanned = 0 ORDER BY start_time DESC LIMIT 20;
Kết luận
Sử dụng Snowflake hiệu quả: star schema, clustering keys theo filter columns, materialized views cho aggregation lặp lại. Ventra Rocket thường đạt 60-80% giảm credit sau khi áp dụng các kỹ thuật này.