Hur cachelagring fungerar i Snowflake

Automatisering av datapipelines i Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Tre cachenivåer

Cachelager.png

Snowflake cachelagrar resultat på tre nivåer — var och en med olika omfång och varaktighet

  • Resultatchache — lagrar fullständiga frågeresultat och returnerar dem utan att starta ett lager
  • Lager- eller datacache — nyligen inlästa mikropartitioner i minne och SSD
  • Metadatachache — alltid aktiv; tabellstatistik används vid frågeplaneringen
Automatisering av datapipelines i Snowflake

När resultatchachen används (och när den inte gör det)

Flödesdiagram för Snowflakes frågeresultatchache som visar en fråga som returnerar ett omedelbart cachat resultat till användaren

Villkor Cache-miss när…
Frågetexten matchar exakt Skiftläge, blanksteg eller alias skiljer sig
Inga icke-återanvändbara funktioner Funktioner som ändras mellan körningar: RANDOM
Underliggande tabeller är oförändrade DML, omkluster eller konsolidering sedan senaste körning
Sparat resultat är fortfarande tillgängligt 24-timmars TTL löpt ut utan återanvändning, eller 31 dagar
Rollen har nödvändiga behörigheter SELECT: rollen saknar behörighet SHOW: annan roll
Automatisering av datapipelines i Snowflake

Lagercache och metadatachache

Diagram över Snowflakes datacache som visar cacheträff respektive cachemiss för lagercachen

Lagercache

  • Lagrar nyligen inlästa mikropartitioner på lagrets SSD och i minnet
  • Rensas när lagret pausas
  • Håll automatisk paus tillräckligt lång för att bevara cachen

Metadatachache

  • Alltid aktiv, finns i Cloud Services
  • Lagrar tabellstatistik
  • Vissa frågor besvaras enbart från metadata
Automatisering av datapipelines i Snowflake

SQL-mönster som förhindrar partitionspruning

Förhindrar pruning:

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

Tillåter pruning:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Automatisering av datapipelines i Snowflake

Ytterligare två SQL-mönster att undvika

Undvik 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';

Undvik implicita korsjoinar

-- 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;
Automatisering av datapipelines i Snowflake

Låt oss öva!

Automatisering av datapipelines i Snowflake

Preparing Video For Download...