Co to jest Tabela Dynamiczna?

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:

  • create definiujesz, że tworzysz dynamic table
  • 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
  • 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.

  1. 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.
  2. 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.
  3. 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.


Nie przegap kolejnych wpisów -> śledź mnie:


Opublikowano

w

przez

Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *