Jak funguje cachování v Snowflake

Automatizace datových pipeline ve Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Tři vrstvy cache

Vrstvy cache.png

Snowflake ukládá výsledky do cache na třech úrovních — každá má jiný rozsah a dobu platnosti

  • Cache výsledků — ukládá kompletní výsledky dotazů a vrací je bez spuštění skladu
  • Cache skladu (datová cache) — nedávno načtené mikro-oddíly v paměti a na SSD
  • Metadata cache — vždy aktivní; statistiky tabulek používané při plánování dotazů
Automatizace datových pipeline ve Snowflake

Kdy je cache výsledků použita (a kdy ne)

Diagram toku cache výsledků Snowflake zobrazující dotaz vracející okamžitý výsledek z cache uživateli

Podmínka Cache není použita, pokud…
Text dotazu se přesně shoduje Liší se velikost písmen, mezery nebo aliasy
Žádné neopakované funkce Funkce měnící se mezi spuštěními: RANDOM
Podkladové tabulky se nezměnily DML, reclusterování nebo konsolidace od posledního spuštění
Uložený výsledek je stále dostupný Vypršelo 24hodinové TTL bez opětovného použití nebo 31 dní
Role má požadovaná oprávnění SELECT: role nemá oprávnění; SHOW: jiná role
Automatizace datových pipeline ve Snowflake

Cache skladu a metadata cache

Diagram datové cache Snowflake zobrazující scénáře zásahu a nezasažení cache skladu

Cache skladu

  • Ukládá nedávno načtené mikro-oddíly na SSD a do paměti skladu
  • Vymazána při pozastavení skladu
  • Nastavte dostatečně dlouhé automatické pozastavení pro zachování cache

Metadata cache

  • Vždy aktivní, umístěna v Cloud Services
  • Ukládá statistiky tabulek
  • Některé dotazy jsou zodpovězeny pouze z metadat
Automatizace datových pipeline ve Snowflake

Vzory SQL bránící ořezávání oddílů

Zabraňuje ořezávání:

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

Umožňuje ořezávání:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Automatizace datových pipeline ve Snowflake

Další dva vzory SQL, kterým se vyhnout

Vyhněte se 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';

Vyhněte se implicitním křížovým spojením

-- 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;
Automatizace datových pipeline ve Snowflake

Lass uns üben!

Automatizace datových pipeline ve Snowflake

Preparing Video For Download...