Jak działa buforowanie w Snowflake

Automatyzacja potoków danych w Snowflake

Emily Melhuish

Technical Curriculum Developer, Snowflake

Trzy warstwy buforowania

Warstwy buforowania.png

Snowflake buforuje wyniki na trzech poziomach — każdy ma inny zakres i czas trwania

  • Pamięć podręczna wyników — przechowuje pełne wyniki zapytań i zwraca je bez uruchamiania magazynu
  • Pamięć podręczna magazynu — ostatnio skanowane mikro-partycje w pamięci RAM i na dysku SSD
  • Pamięć podręczna metadanych — zawsze aktywna; statystyki tabel używane podczas planowania zapytań
Automatyzacja potoków danych w Snowflake

Kiedy pamięć podręczna wyników jest używana (a kiedy nie)

Diagram przepływu pamięci podręcznej wyników Snowflake przedstawiający zapytanie zwracające natychmiastowy wynik z pamięci podręcznej

Warunek Brak trafienia w pamięć podręczną, gdy…
Tekst zapytania jest identyczny Różnice w wielkości liter, odstępach lub aliasach
Brak funkcji niewymienianych Funkcje zmieniające się między uruchomieniami: RANDOM
Tabele źródłowe niezmienione DML, ponowne klastrowanie lub konsolidacja od ostatniego uruchomienia
Zachowany wynik nadal dostępny Upłynął 24-godzinny TTL bez ponownego użycia lub 31 dni
Rola posiada wymagane uprawnienia SELECT: rola bez uprawnień; SHOW: inna rola
Automatyzacja potoków danych w Snowflake

Pamięć podręczna magazynu i pamięć podręczna metadanych

Diagram pamięci podręcznej danych Snowflake przedstawiający scenariusze trafienia i braku trafienia w pamięć podręczną magazynu

Pamięć podręczna magazynu

  • Przechowuje ostatnio skanowane mikro-partycje na dysku SSD i w pamięci RAM
  • Czyszczona po zawieszeniu magazynu
  • Ustaw wystarczająco długi czas automatycznego zawieszenia, aby zachować pamięć podręczną

Pamięć podręczna metadanych

  • Zawsze aktywna, przechowywana w usługach chmurowych
  • Przechowuje statystyki tabel
  • Niektóre zapytania są obsługiwane wyłącznie z metadanych
Automatyzacja potoków danych w Snowflake

Wzorce SQL uniemożliwiające przycinanie partycji

Uniemożliwia przycinanie:

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

Umożliwia przycinanie:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Automatyzacja potoków danych w Snowflake

Dwa kolejne wzorce SQL, których należy unikać

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

Unikaj niejawnych złączeń krzyżowych

-- 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;
Automatyzacja potoków danych w Snowflake

Czas na ćwiczenia!

Automatyzacja potoków danych w Snowflake

Preparing Video For Download...