Cum funcționează cache-ul în Snowflake

Automatizarea pipeline-urilor de date în Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Trei niveluri de cache

Niveluri de cache.png

Snowflake stochează rezultate în cache la trei niveluri — fiecare cu o durată și un domeniu diferit

  • Cache de rezultate — stochează rezultate complete și le returnează fără a utiliza un warehouse
  • Cache de warehouse sau date — micro-partiții recent scanate în memorie și SSD
  • Cache de metadate — mereu activ; statistici de tabel utilizate în planificarea interogărilor
Automatizarea pipeline-urilor de date în Snowflake

Când se utilizează cache-ul de rezultate (și când nu)

Diagramă flux cache de rezultate Snowflake, care arată o interogare returnând instant un rezultat din cache utilizatorului

Condiție Cache ratat când…
Textul interogării se potrivește exact Majusculele, spațiile sau aliasurile diferă
Fără funcții non-reutilizabile Funcții care se modifică între execuții: RANDOM
Tabelele de bază sunt nemodificate DML, reclusterizare sau consolidare de la ultima execuție
Rezultatul stocat este disponibil TTL de 24 de ore expirat fără reutilizare sau 31 de zile
Rolul are privilegiile necesare SELECT: rol fără privilegii SHOW: rol diferit
Automatizarea pipeline-urilor de date în Snowflake

Cache de warehouse și cache de metadate

Diagramă cache de date Snowflake, prezentând scenarii de cache hit și cache miss pentru warehouse

Cache de warehouse

  • Stochează micro-partiții recent scanate pe SSD-ul și în memoria warehouse-ului
  • Șters când warehouse-ul este suspendat
  • Păstrați auto-suspend suficient de lung pentru a menține cache-ul

Cache de metadate

  • Mereu activ, rezidă în Cloud Services
  • Stochează statistici de tabel
  • Unele interogări sunt rezolvate doar din metadate
Automatizarea pipeline-urilor de date în Snowflake

Tipare SQL care împiedică partiționarea (pruning)

Împiedică pruning:

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

Permite pruning:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Automatizarea pipeline-urilor de date în Snowflake

Alte două tipare SQL de evitat

Evitați SELECT *

-- Reads every column
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Reads only what's needed
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

Evitați join-urile încrucișate implicite

-- Missing join condition = Cartesian
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- Explicit JOIN with ON condition
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
Automatizarea pipeline-urilor de date în Snowflake

Să exersăm!

Automatizarea pipeline-urilor de date în Snowflake

Preparing Video For Download...