Optymalizacja raportów Power BI – cz.1

Optymalizacja działania raportów jest tematem bardzo szerokim. By móc efektywnie optymalizować modele i raporty, musimy poznać podstawy działania silników DAX.

Silniki w DAX

Silniki wykorzystywane w DAX można podzielić na następujące:

  • silnik formuł – generuje i wykonuje plan zapytania. Inaczej mówiąc to co napiszemy w formułach DAX, przekształca i wykonuje plan zapytania (działania) – listę czynności do zrobienia, który przekazuje do silnika magazynowego. Pisząc formuły w DAX, komunikujemy się w tym języku z silnikiem formuł.
  • silnik magazynowy – wykonuje plan zapytania dostarczony od silnika formuł – przekazuje zapytania do baz (źródeł) danych. Komunikuje się tylko ze źródłami danych i silnikiem formuł. Inaczej mówiąc, dostarcza ze źródła danych bufor danych jaki potrzebuje silnik formuł, by zrealizować nasze zapytanie.

Silniki magazynowe w DAX są dwa:

  • Direct Query – przekierowuje zapytania wprost do źródła danych nie tworząc kopii danych w pamięci (Direct Mode)
  • VertiPaq – przechowuje w pamięci kopię danych odświeżaną cyklicznie ze źródła danych (Import Mode)

W jednym raporcie, a nawet tabeli można używać jednego silnika lub dwóch naraz – w trybie tzw. Dual.

Silnik VertiPaq jest najczęściej używanym silnikiem magazynowym, posiada też największe pole do optymalizacji. Dalsze rozważania skupiać się zatem będą głównie na tym silniku

Działanie VertiPaq

Silnik VertiPaq pobiera dane ze źródła i transformuje je na kolumnową bazę danych – tzn. kolumny tabeli są przechowywane jako oddzielne struktury. Jest to kluczowa informacja potrzebna do efektywnej optymalizacji zapytań. Oznacza to, że odświeżanie i obliczenia na jednej kolumnie są błyskawiczne, a im więcej kolumn, tym więcej „skakania” między strukturami i wszystko trwa dłużej. Dzięki kolumnowej strukturze danych, VertiPaq efektywnie koduje i kompresuje kolumny, co ma kluczowe znaczenie w wydajności raportów.

Kodowanie i kompresowanie kolumn VertiPaq

W związku z kolumnową strukturą danych, VertiPaq koduje i kompresuje każdą kolumnę z osobna. Wyróżniamy 3 typy kodowania w VertiPaq:

  • kodowanie całkowitoliczbowe – używane dla kolumn całkowitoliczbowych. Silnik zmniejsza rozmiar kolumn, np. odejmując jakąś liczbę od występujących w niej wartości.
  • kodowanie słownikowe – używane dla wszystkich kolumn niecałkowitoliczbowych. Wyszukuje unikatowe wartości np. Anna, Beata w kolumnach i tworzy na ich podstawie słownik, ładując do modelu wartości całkowite. Dlatego kardynalność kolumny (liczba unikatowych wartości) jest tak ważna w kontekście wydajności
  • kodowanie powtarzających się wartości – kodowanie używane uzupełniająco do obu poprzednich. Tworzy słownik np. dla wartości Anna, Beata, Beata, Cecylia utworzy 0-1, 1-2, 2-1. Zatem im więcej powtarzających się wartości, tym słownik mniejszy i wydajność większa.

Stopień kompresji danych zależy więc (kolejność od najważniejszego):

  1. Kardynalność kolumny (distinct values)
  2. Powtarzalność wartości w kolumnie
  3. Liczba wierszy kolumny
  4. Typ danych

Po pobraniu skompresowanych danych, tworzone są kolumny obliczane, relacje i hierarchie. Model jest gotowy do użytku.

Podsumowanie

Pobierając dane ze źródła, traktujemy każdą kolumnę jako odrębny byt – problem. Stopień obciążenia modelu przez tą kolumnę będzie zależał przede wszystkim od jej kardynalności, w mniejszej części od powtarzalności danych i w znikomej od liczby wierszy i typów danych.