Cache w Snowflake – jak go wykorzystać?

Zastanawiasz się jak wycisnąć ze Snowflake’a jeszcze więcej? Przyspieszyć wykonywanie zapytań i zmniejszyć koszty? Zastanów się jak wykorzystać pamięć podręczną (cache), której Snowflake udostępnia trzy poziomy:

  • Query Result Cache (pamięć podręczna wyników zapytania)
  • Metadata Cache (pamięć podręczna metadanych)
  • Virtual Warehouse Local Disk Cache (pamięć podręczna lokalnego dysku wirtualnych magazynów)

Metadata Cache

Zaryzykuję stwierdzenie, że ta pamięć podręczna jest najważniejszą.
Snowflake przechowuje metadane w warstwie usług chmurowych. Tak samo przechowuje Query Result Cache, ale w odróżnieniu od niej metadane są przechowywane tak długo, jak tabela, którą opisują.

To o co chodzi z tą pamięcią? Metadata Cache to nic innego jak metadane o obiektach w Snowflake’u, takie jak:

  • struktura
  • liczba kolumn
  • liczba unikatowych wartości
  • wartości NULL
  • wartości minimalne i maksymalne.

Te dane zawierają informacje o tabelach na poziomie mikro-partycji, które opisałem w tym wpisie.

Dzięki tym danym Snowflake jest w stanie efektywnie odczytywać jedynie mikro-partycje, które zawierają wyszukiwane dane, jak również zaoszczędzić wiele dolarów, gdyż niektóre zapytania nie będą wymagały nawet uruchomienia wirtualnego magazynu (takie jak SELECT COUNT(*) FROM TABLE).

Query Result Cache

Z całego Snowflake’a to jest miejsce z którego można najszybciej odczytać dane. Query Result Cache w Snowflake jest zarządzany przez warstwę usług chmurowych (Cloud Services). Mają do niej dostęp wszystkie wirtualne magazyny (Virtual Warehouse) i wszystkich użytkowników, którzy mają dostęp do tych obiektów.

Wyniki zapytań są zapisywane w pamięci podręcznej i przechowywane przez 24 godziny od ostatniego uruchomienia zapytania maksymalnie przez 31 dni lub do momentu aż dane źródłowe zostaną zmienione.

Piękną rzeczą jest fakt, że jeśli wyniki zapytania odczytywane z tej pamięci podręcznej w pełni zaspokajają uruchomione zapytanie Snowflake nie potrzebuje uruchamiać Virtual Warehouse’a, żeby wyświetlić wynik.

W sytuacji, gdy nie chcesz odczytywać danych z tej pamięci, bo zależy Ci na przetestowaniu wydajności zapytania wystarczy, że zmienisz parametry sesji:

ALTER SESSION SET USE_CACHED_RESULT=FALSE;

Jakie są wymagania, żeby skorzystać z Query Result Cache?

  • Zapytanie musi być składniowo równoważne
  • Nie wykorzystujesz dynamicznych funkcji, takich jak current_date()
  • Dane w tabelach źródłowych się nie zmieniły
  • Użytkownik uruchamiający zapytanie ma dostęp do tych danych

Virtual Warehouse Local Disk Cache

Snowflake po uruchomieniu Virtual Warehouse najpierw odczytuje dane z magazynów chmurowych (AWS S3, Azure Container, GCP Bucket). Następnie zapisuje je na dysku SSD (odczyt z dysków SSD jest znacznie szybszy niż bezpośrednio z magazynów chmurowych). Na sam koniec Snowflake dokonuje wszelkich obliczeń i przetworzeń. Dysk SSD w Virtual Warehouse jest pamięcią podręczną magazynów wirtualnych Snowflake.

Jeśli Virtual Warehouse jest już uruchomiony, to odpowiadając na zapytanie Snowflake najpierw zweryfikuje, czy ma już zapisane tabele źródłowe, do których zapytanie się odwołuje.

Dyski SSD przypisane do Wirtualnego Magazynu są zależne od jego rozmiaru. W sytuacji ich wypełnienia Snowflake automatycznie usuwa dane, których czas, jaki upłynął od ich ostatniego odczytania jest największy. Drugim momentem usuwanie tej pamięci jest wyłączenie/zatrzymanie Wirtualnego Magazynu.

Podsumowując

Umiejętne wykorzystanie pamięci cache w Snowflake pozwoli znacząco zwiększyć wydajność odczytu danych jak i zmniejszyć ponoszone koszty.

Trzeba jednak pamiętać, że w znaczącym stopniu w efektywnym ich wykorzystaniu pomoże tutaj też odpowiednie modelowanie danych. Bez dobrego modelu danych koszty utrzymania jak i koszty zapytań mogą nagle urosnąć do poziomu przekraczającego najgorsze koszmary. Dodatkowo jakość danych na końcu może być znacznie gorsza, jeśli model nie będzie dobrze zaprojektowany.


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


Komentarze

Dodaj komentarz

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