Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Wydajność modelu i raportu

Plik .pbix rośnie do setek megabajtów - kolumny o dużej kardynalności

W skrócie

  • Duży plik Power BI rośnie zwykle przez kilka kolumn o dużej kardynalności, czyli z wieloma różnymi wartościami: identyfikatory, kwoty do grosza, znaczniki daty z godziną i kolumny obliczeniowe.
  • Silnik VertiPaq kompresuje każdą kolumnę osobno i im więcej różnych wartości, tym gorzej. W modelu Nordvelli cztery kolumny kwot i identyfikator transakcji zajmują 74% danych tabeli sprzedaży.
  • Znajdź najcięższe kolumny w VertiPaq Analyzer albo zapytaniem DAX, usuń nieużywane, obetnij godzinę i zbędną precyzję, a kolumny obliczeniowe zamień na miary albo kroki Power Query.

Liczba wierszy rośnie wolniej niż rozmiar pliku, a raport po kilku miesiącach waży setki megabajtów. Za tak duży plik Power BI odpowiadają zwykle pojedyncze kolumny o dużej kardynalności, czyli z wieloma różnymi wartościami. Pokazujemy, jak je wskazać, na pomiarach z modelu Nordvelli, i jak zmniejszyć model tak, żeby raport pokazywał te same liczby.

Jak to wygląda w praktyce

Plik .pbix rośnie z każdym odświeżeniem, zapis i publikacja trwają coraz dłużej, a model zajmuje coraz więcej pamięci. W lekcji o wydajności VertiPaq Analyzer w DAX Studio pokazał, że tabela FaktSprzedaz zajmuje 87,58% modelu Nordvelli, a jedna kolumna obliczeniowa z lekcji 7 waży 4 052 372 bajty, czyli 42,19% całego modelu. Po jej usunięciu plik zmalał z 8,4 MB do 7,1 MB, a liczby w raporcie się nie zmieniły.

W gotowym modelu z końca kursu zmierzyliśmy kolumny FaktSprzedaz zapytaniem DAX. Pięć najcięższych to kwoty WartoscBrutto i WartoscNetto (po 434 832 bajty danych) oraz CenaNetto, MarzaNetto i identyfikator SprzedazID (po 289 936 bajtów). Razem to 74% danych tabeli. Kolumna KanalSprzedazy z trzema wartościami zajmuje 136 bajtów.

Dlaczego tak się dzieje

Power BI trzyma dane w silniku kolumnowym VertiPaq, który kompresuje każdą kolumnę osobno. O rozmiarze decyduje kardynalność, czyli liczba różnych wartości w kolumnie. Według dokumentacji Microsoft najlepiej kompresują się liczby kodowane wartościowo, a tekst silnik koduje przez słownik, w którym każda unikatowa wartość dostaje własny identyfikator. Kodowanie wybiera silnik: w Nordvelli kwoty i SprzedazID mają kodowanie wartościowe, a liczbowy klucz DataID słownik o rozmiarze 39 488 bajtów. Kolumna z kilkoma wartościami kosztuje prawie nic, a kolumny, w których prawie każdy wiersz jest inny, należą do najcięższych.

W FaktSprzedaz (108 675 wierszy) SprzedazID ma 108 675 różnych wartości, WartoscNetto 96 723, DataID 1 612, a FormaPlatnosci 5. Szczególnie dużo różnych wartości dają znaczniki daty z godziną. Model Nordvelli trzyma samą datę, a klucz DataID ma 1 612 wartości. W teście dopisaliśmy w zapytaniu DAX kolumnę, która każdej transakcji przypisuje inną godzinę między 8:00 a 20:00. Data z godziną miała wtedy 108 675 różnych wartości, tyle co wierszy, a sama godzina zaokrąglona do minuty 721. Kolumna z samą godziną co do minuty nie przekroczy 1 440 wartości, bo tyle minut ma doba. Kolumny obliczeniowe kompresują się gorzej niż źródłowe, co rozwijamy w poście o kolumnie obliczeniowej, która spowalnia odświeżanie.

VertiPaq Analyzer w DAX Studio, widok Columns: kolumna obliczeniowa na pierwszym miejscu z 42,19 procent modelu Nordvelli
Widok Columns w VertiPaq Analyzer: na górze kolumna obliczeniowa z lekcji 7, 96 887 różnych wartości, 4 052 372 bajty i 42,19 procent modelu. Źródłową kolumnę kwoty brutto silnik koduje wartościowo, a kolumnę obliczeniową słownikiem.

Co zrobić krok po kroku

  1. Zmierz rozmiar kolumn. W DAX Studio (karta Narzędzia zewnętrzne w Power BI Desktop) kliknij Advanced, View Metrics i przejdź do widoku Columns posortowanego po rozmiarze. Bez dodatkowego narzędzia rozmiar danych kolumn, bez słownika, pokaże zapytanie uruchomione w widoku zapytań w języku DAX. W modelu Nordvelli zwraca 17 wierszy, a na górze są WartoscBrutto i WartoscNetto po 434 832 bajty.
    EVALUATE
    SELECTCOLUMNS(
        FILTER(
            INFO.STORAGETABLECOLUMNSEGMENTS(),
            LEFT([TABLE_ID], 12) = "FaktSprzedaz"
        ),
        "Kolumna", [COLUMN_ID],
        "Bajty", [USED_SIZE]
    )
    ORDER BY [Bajty] DESC
  2. Sprawdź kardynalność. Funkcja COLUMNSTATISTICS zwraca dla każdej kolumny liczbę różnych wartości, minimum i maksimum. W FaktSprzedaz pierwszy wiersz to wewnętrzna kolumna RowNumber, którą silnik dodaje do każdej tabeli, a za nią są SprzedazID (108 675), WartoscNetto (96 723) i WartoscBrutto (96 652). Na dole listy są CzyZwrot i CzyAnomalia z dwiema wartościami.
    EVALUATE
    FILTER(COLUMNSTATISTICS(), [Table Name] = "FaktSprzedaz")
    ORDER BY [Cardinality] DESC
  3. Usuń kolumny, których nikt nie używa: źródłową w Power Query (prawy przycisk na nagłówku, Usuń albo Usuń inne kolumny), obliczeniową w widoku tabeli (prawy przycisk na nagłówku, Usuń, potwierdzenie Tak). Przedtem sprawdź, czy nie korzysta z niej miara, wizualizacja albo inna kolumna obliczeniowa. W Nordvelli SprzedazID wygląda na zbędny identyfikator, ale korzysta z niego kolumna obliczeniowa DataZakupu w tabeli zwrotów, co pokazuje funkcja INFO.CALCDEPENDENCY. Samo Ukryj w widoku raportu nie zmniejsza modelu ani o bajt.
  4. Obetnij godzinę, gdy raportujesz w skali dnia. Krok w Power Query zamienia datę i godzinę na samą datę, a liczba różnych wartości spada do liczby dni. Gdy godzina jest potrzebna, trzymaj ją w osobnej kolumnie zaokrąglonej do minuty: w naszym teście z wygenerowanymi godzinami 1 612 dat i 721 minut zamiast 108 675 różnych znaczników. Więcej o usuwaniu czasu piszemy w poście o dacie i godzinie zamiast samej daty.
    // Power Query (M): wzór kroku, PoprzedniKrok i DataGodzina zastąp swoimi nazwami
    Table.TransformColumns(
        PoprzedniKrok,
        {{"DataGodzina", each DateTime.Date(_), type date}}
    )
  5. Ogranicz precyzję liczb tylko wtedy, gdy raport jej nie potrzebuje. Zaokrąglenie WartoscNetto do pełnych złotych zmniejsza liczbę różnych wartości z 96 723 do 14 923, ale suma sprzedaży rośnie o 772,83 zł (467 775 782 zł zamiast 467 775 009,17 zł). W Nordvelli kwoty mają dwa miejsca po przecinku i tak zostają, bo raport liczy do grosza. Kod zamówienia z prefiksem tekstowym, na przykład SO123456, według dokumentacji Microsoft lepiej zapisać jako liczbę całkowitą i ustawić mu podsumowanie Nie sumuj.
  6. Usuń zbędne wiersze i ukryte tabele. Dokumentacja Microsoft zaleca ładować tylko potrzebną historię, na przykład przez filtr dat z parametrem w Power Query, i wyłączyć Automatyczna data/godzina, która tworzy ukrytą tabelę dat dla każdej kolumny daty. Szczegóły opisujemy w poście o automatycznej dacie i godzinie.

Jak sprawdzić, że problem zniknął

Po zmianach jeszcze raz uruchom View Metrics albo zapytanie z kroku 1 i porównaj rozmiary kolumn. Zapisz plik i sprawdź jego rozmiar na dysku. Na koniec otwórz strony raportu i porównaj główne sumy, na przykład [Łączna sprzedaż] Nordvelli musi dać 467 775 009,17 zł przed zmianami i po nich. Gdy plik ma trafić do usługi, sprawdź też limity rozmiaru, które opisujemy w poście o pliku za dużym do publikacji.

Żeby model nie rósł z powrotem, dodawaj kolumnę tylko wtedy, gdy służy raportowi albo strukturze modelu, czyli relacjom, miarom i rolom zabezpieczeń. Dokumentacja Microsoft zwraca uwagę, że kolumnę łatwiej dodać później, niż usunąć, bo usunięcie potrafi zepsuć raport.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Data reduction techniques for Import modeling (źródło)
  • Microsoft Learn: COLUMNSTATISTICS function (DAX) (źródło)
  • Microsoft Learn: INFO.STORAGETABLECOLUMNSEGMENTS function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: kardynalność i rozmiar danych kolumn FaktSprzedaz, test daty z godziną i test zaokrąglenia kwot.

Zachowanie programu sprawdziliśmy w Power BI Desktop 2.157 (wydanie z sierpnia 2026 r.) z polskim interfejsem, a przykłady na modelu sieci Nordvella z bezpłatnego kursu Power BI. Microsoft wydaje nową wersję Power BI Desktop co miesiąc, więc nazwy przycisków i limity usługi mogą się zmieniać. Aktualne wartości podaje dokumentacja Microsoft Learn.

Wróć do listy: 131 najczęstszych pytań i problemów związanych z Power BI

Najczęściej zadawane pytania

Dlaczego plik Power BI jest taki duży?
Najczęściej przez kilka kolumn o dużej kardynalności, czyli z wieloma różnymi wartościami, na przykład identyfikatory, kwoty do grosza i znaczniki daty z godziną. Silnik VertiPaq kompresuje każdą kolumnę osobno, więc kolumna z trzema wartościami kosztuje prawie nic, a kolumny, w których prawie każdy wiersz jest inny, należą do najcięższych. Dochodzą do tego kolumny obliczeniowe i ukryte tabele automatycznej daty.
Co to jest kardynalność kolumny w Power BI?
To liczba różnych wartości w kolumnie. W tabeli sprzedaży Nordvelli identyfikator transakcji ma 108 675 różnych wartości, kwota netto 96 723, a kanał sprzedaży 3. Im wyższa kardynalność, tym gorzej kolumna się kompresuje i tym więcej zajmuje w modelu.
Jak sprawdzić, która kolumna zajmuje najwięcej miejsca w Power BI?
W DAX Studio użyj VertiPaq Analyzer: Advanced, View Metrics i widok Columns posortowany po rozmiarze. Bez dodatkowego narzędzia uruchom w widoku zapytań w języku DAX zapytanie na INFO.STORAGETABLECOLUMNSEGMENTS z kolumną USED_SIZE, a liczbę różnych wartości pokaże funkcja COLUMNSTATISTICS.
Czy ukrycie kolumny zmniejsza plik Power BI?
Nie. Ukryj w widoku raportu tylko chowa kolumnę z listy pól, a dane dalej są w modelu. Żeby zmniejszyć plik, kolumnę trzeba usunąć: źródłową w Power Query, obliczeniową w widoku tabeli. Przed usunięciem sprawdź, czy nie korzysta z niej miara, wizualizacja albo inna kolumna obliczeniowa.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...