Cách bộ nhớ đệm hoạt động trong Snowflake

Tự động hóa Data Pipeline trong Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Ba lớp bộ nhớ đệm

Các lớp bộ nhớ đệm.png

Snowflake lưu đệm kết quả ở ba lớp — mỗi lớp có phạm vi và thời hạn khác nhau

  • Result cache — lưu toàn bộ kết quả truy vấn và trả về không cần chạy warehouse
  • Warehouse/data cache — các micro-partition quét gần đây trong bộ nhớ và SSD
  • Metadata cache — luôn bật; thống kê bảng dùng cho lập kế hoạch truy vấn
Tự động hóa Data Pipeline trong Snowflake

Khi nào dùng Result Cache (và khi nào không)

Sơ đồ luồng Result Cache của Snowflake cho thấy truy vấn trả kết quả tức thì từ bộ nhớ đệm

Điều kiện Trượt cache khi…
Văn bản truy vấn khớp chính xác Khác chữ hoa/thường, khoảng trắng, hoặc bí danh
Không có hàm không tái sử dụng các hàm thay đổi giữa các lần chạy: RANDOM
Bảng nền không đổi Có DML, reclustering, hoặc consolidation từ lần chạy trước
Kết quả lưu còn khả dụng Hết TTL 24 giờ không được dùng lại, hoặc sau 31 ngày
Role có đủ quyền SELECT: role thiếu quyền SHOW: role khác
Tự động hóa Data Pipeline trong Snowflake

Warehouse cache và Metadata cache

Sơ đồ data cache của Snowflake cho thấy kịch bản cache hit và cache miss của warehouse

Warehouse cache

  • Lưu các micro-partition vừa quét trên SSD + bộ nhớ của warehouse
  • Xóa khi warehouse tạm dừng
  • Đặt auto-suspend đủ lâu để giữ cache

Metadata cache

  • Luôn bật, nằm trong Cloud Services
  • Lưu thống kê bảng
  • Một số truy vấn được trả lời chỉ từ metadata
Tự động hóa Data Pipeline trong Snowflake

Mẫu SQL làm ngăn cắt tỉa phân vùng

Ngăn cắt tỉa phân vùng:

SELECT *
FROM logistics.shipments
WHERE MONTH(dispatch_date) = 3;

Cho phép cắt tỉa phân vùng:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Tự động hóa Data Pipeline trong Snowflake

Hai mẫu SQL nữa cần tránh

Tránh SELECT *

-- Đọc mọi cột
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Chỉ đọc cột cần thiết
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

Tránh cross-join ngầm

-- Thiếu điều kiện join = tích Descartes
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- JOIN tường minh với điều kiện ON
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
Tự động hóa Data Pipeline trong Snowflake

Hãy thực hành!

Tự động hóa Data Pipeline trong Snowflake

Preparing Video For Download...