Tabela dynamiczna w Snowflake’u przechowuje dane jak każda inna stała tabela, ale ma kilka zasadniczych różnic:
- Tworząc tabelę definiujesz logikę transformacji zgodnie z którymi Snowflake będzie ją aktualizował oraz częstotliwość tych aktualizacji.
- Snowflake udostępnia w graficznym interfejsie wgląd w graf przedstawiający zależności między tabelami dynamicznymi.
Do przedstawienia przykładów stworzę bardzo prostą tabelę.
create or replace transient table dynamic.tables.transaction
(
id number(10,0)
,user_id number(10,0)
,date date
,value number(38,2)
);
Utworzę też task, który regularnie co 20 minut będzie zasilał tę tabelę. Na potrzeby przykładu wstawiane dane są nieistotne.
create or replace task dynamic.tables.dynamic_task
warehouse = compute_wh
schedule = '20 minutes'
as
insert into dynamic.tables.transaction (id, user_id, date, value)
SELECT uniform(11, 100::number(10,2), random()) as id
,uniform(1, 10::number(10,2), random()) as user_id
,current_date() as date
,uniform(170, 10000::number(10,2), random()) as value
FROM TABLE(GENERATOR(ROWCOUNT => 12)) v;
alter task dynamic.tables.dynamic_task resume;
Jak utworzyć tabelę dynamiczną?
Kod jest dość prosty:
- w
create
definiujesz, że tworzyszdynamic table
- w
target_lag
definiujesz oczekiwaną świeżość danych, w którą Snowflake ma celować – tutaj nie masz gwarancji, że aktualizacja tabeli będzie uruchamiana dokładnie ze zdefiniowanym harmonogramem - w
warehouse
definiujesz z którego klastra obliczeniowego ma korzystać Snowflake, żeby odświeżać tabelę - po słowie kluczowym
as
definiujesz cały kod transformacji. Nie obowiązują Cię limity, jakie spotkasz przy tworzeniu widoków zmaterializowanych, ale zależnie od poziomu skomplikowania i wykorzystanych funkcji Snowflake być może nie będzie w stanie skorzystać z inkrementalnego odświeżania i będzie musiał odbudować tabelę w całości.
create or replace dynamic table dynamic.tables.daily_stats
target_lag = '1 minute'
warehouse = dynamic_wh
as
select date
,sum(value) as total_value
,avg(value) as avg_value
,min(value) as min_value
,max(value) as max_value
,count(*) as transactions_count
from dynamic.tables.transaction
group by all;
Sprawdźmy jak wygląda opis tej tabeli.
show dynamic tables;
W tym przypadku definicja jest na tyle prosta, że Snowflake może odświeżać tabelę inkrementalnie, a oczekiwana częstotliwość odświeżania to 1 minuta. Wcześniej zdefiniowaliśmy taska, który tabelę źródłową odświeża co 20 minut, więc można powiedzieć, że tabela dynamiczna w tym wypadku będzie odświeżana szybko po tabeli źródłowej, ale w międzyczasie 19 razy zdąży odpytać tabelę źródłową, czy ma nowe dane.
Te same informacje znajdziesz też w interfejsie graficznym, razem z grafem przedstawiającym DAG tej tabeli.
W zakładce przedstawiającej DAG tabeli znajdziesz też ciekawe statystyki:
- % czasu, gdy Snowflake utrzymał odświeżenie tabeli zgodnie z harmonogramem (Time Within Target Lag)
- maksymalne opóźnienie odświeżenia (Maximum Lag)
Jak wygląda odświeżanie tabel dynamicznych?
W zakładce Refresh History znajdziesz wszystkie zdarzenia dotyczące odświeżania tabeli dynamicznej i główne statystyki dotyczące odświeżania. W kolumnie Rows Changed Snowflake pokazuje ile wierszy z tabeli dodał i ile usunął. podczas każdego odświeżania.
Profil zapytania jest dość skomplikowany nawet dla tak prostej tabeli, więc nie będę wchodzić w szczegóły. Poniżej treść zapytania SQL, które Snowflake uruchamia automatycznie i część profilu zapytania.
Ile kosztują tabele dynamiczne?
Wszystko fajnie, tylko ile to może kosztować? W tym przykładzie wygląda to na strasznie drogą imprezę. W końcu zapytanie aktualizujące uruchamiane jest co minutę, więc warehouse musi pracować bez przerwy?
Nic bardziej mylnego! Podsumujmy fakty i policzmy.
- Dane do tabeli bazowej są dodawane co 20 minut, co daje 72 operacje
insert
na dobę, czyli tabela dynamiczna doświadcza zmian 72 razy dziennie. - Uruchamiając warehouse w SNowflake’u płaci się za każdą sekundę pracy, ale nie mniej niż za minutę. Jeśli wziąć pod uwagę jedynie „produktywne” zapytania, które zmieniają tabelę dynamiczną mamy 72 minuty dziennie.
- Do utrzymania przykładowej tabeli dynamicznej wykorzystałem warehouse w rozmiarze XS, który kosztuje 1 kredyt za godzinę pracy.
72 / 60 = 1,2 kredytu dziennie
Historia wykorzystania mojego klastra obliczeniowego potwierdza te wyliczenia. COMPUTE 1,2 to rzeczywiste wykorzystanie uruchomionego warehouse’a, a CLOUD 0,1 to „puste” zapytania, którymi SNowflake weryfikował świeżość danych tabeli bazowej.
Pamiętaj, że za wykorzystanie Cloud Services płacisz jedynie za zużycie przekraczające 10% zużycia COMPUTE.
Co warto pamiętać przy tworzeniu tabel dynamicznych?
- Nadal są w Public Preview, więc nie powinny służyć w produkcyjnym wykorzystaniu, a już szczególnie w krytycznych jego elementach.
- Płacisz za czas pracy Warehouse’ów, więc warto zoptymalizować zapytania i ustawić target lag z rzeczywistymi potrzebami, żeby nie przesadzić.
- Zbyt skomplikowane zapytania lub wykorzystanie niedeterministycznych funkcji może spowodować konieczność pełnego odtworzenia tabeli.
Zajrzyj do oficjalnej dokumentacji Snowflake’a po więcej szczegółów.
Dodaj komentarz