Snowflake 的快取運作方式

在 Snowflake 進行資料管線自動化

Emily Melhuish

Technical Curriculum Developer, Snowflake

三層快取

快取層.png

Snowflake 在三個層級進行快取——範圍與保存時間各異

  • 結果快取(Result cache)——儲存完整查詢結果,無需啟動 warehouse 即可回傳
  • Warehouse/資料快取——將最近掃描的微分割儲存在記憶體與 SSD
  • 中繼資料快取——常駐啟用;於查詢規劃時使用的資料表統計
在 Snowflake 進行資料管線自動化

結果快取何時生效(與不生效時機)

Snowflake 查詢結果快取流程圖,示意查詢立即回傳快取結果給使用者

條件 下列情況會快取失敗(Miss)
查詢文字需完全相同 大小寫、空白或別名不同
無不可重用的函式 函式在不同執行間會改變:RANDOM
來源資料表未變更 自上次執行以來有 DML、重新分群或合併
永續結果仍可用 24 小時 TTL 未重用而到期,或已達 31 天
角色具備必要權限 SELECT:角色缺權限;SHOW:使用不同角色
在 Snowflake 進行資料管線自動化

Warehouse 與中繼資料快取

Snowflake 資料快取圖,顯示 warehouse 快取命中與未命中情境

Warehouse 快取

  • 將最近掃描的微分割儲存在 warehouse 的 SSD 與記憶體
  • 當 warehouse 暫停時會清空
  • 將自動暫停時間設長一點以保留快取

中繼資料快取

  • 永遠啟用,位於 Cloud Services
  • 儲存資料表統計
  • 部分查詢僅用中繼資料即可回應
在 Snowflake 進行資料管線自動化

會阻擋分割修剪的 SQL 寫法

會阻擋修剪(pruning):

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

可進行修剪:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
在 Snowflake 進行資料管線自動化

再避免兩種 SQL 寫法

避免使用 SELECT *

-- 讀取所有欄位
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- 僅讀取需要的欄位
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

避免隱性交叉連接

-- 缺少連接條件=笛卡兒積
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- 明確的 JOIN 與 ON 條件
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
在 Snowflake 進行資料管線自動化

一起來練習吧!

在 Snowflake 進行資料管線自動化

Preparing Video For Download...