Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Wydajność modelu i raportu

Kolumna obliczeniowa spowalnia odświeżanie - kiedy miara albo krok Power Query

W skrócie

  • Kolumna obliczeniowa czy miara to pytanie o wydajność: kolumnę silnik liczy przy każdym odświeżeniu i zapisuje w każdym wierszu, więc wydłuża odświeżanie i powiększa model.
  • Według dokumentacji Microsoft kolumny obliczeniowe powstają dopiero po wczytaniu wszystkich tabel z Power Query i kompresują się gorzej niż kolumny z Power Query. W Nordvelli taka kolumna zajmowała 42,19% modelu.
  • Wartość do wyświetlenia licz miarą, wartość potrzebną we fragmentatorze albo relacji licz w Power Query albo w źródle, a kolumnę obliczeniową zostaw na formuły z miarami i funkcjami tylko z DAX.

Kolumna obliczeniowa zapisuje wynik w każdym wierszu tabeli, a miara liczy go dopiero w zapytaniu wizualizacji. Model, do którego tabel faktów przez lata dopisywano kolumny DAX, płaci za tę różnicę wolniejszym odświeżaniem. Wyjaśniamy, kiedy kolumna obliczeniowa czy miara daje lepszą wydajność, kiedy wynik warto przenieść do kroku Power Query, i pokazujemy, jak znaleźć wszystkie kolumny obliczeniowe modelu jednym zapytaniem.

Jak to wygląda w praktyce

Odświeżanie trwa dłużej po każdej nowej kolumnie DAX, a plik rośnie szybciej niż dane. W lekcji o wydajności VertiPaq Analyzer pokazał na pierwszym miejscu kolumnę obliczeniową z lekcji 7, która liczyła wartość brutto w FaktSprzedaz: 96 887 różnych wartości, 4 052 372 bajty i 42,19% modelu. Źródłowa kolumna WartoscBrutto o podobnej kardynalności zajmowała w tym samym zestawieniu 8,55%, bo silnik kodował ją wartościowo, a kolumnę obliczeniową słownikiem. Żadna wizualizacja nie korzystała z tej kolumny.

Ten sam wynik daje miara. Kolumna liczona wiersz po wierszu formułą miary brutto, którą dopisaliśmy na próbę w zapytaniu DAX na modelu Nordvelli, ma 97 783 różne wartości (formuła z lekcji 7 była inna, stąd inna liczba) i sumę 566 064 985,73 zł, dokładnie tyle, co miara [Sprzedaż brutto], która niczego nie zapisuje w tabeli.

Widok tabeli Power BI: zaznaczona kolumna obliczeniowa brutto w FaktSprzedaz, jej formuła i 96 887 odrębnych wartości
Kolumna obliczeniowa z lekcji 7 zaznaczona w widoku tabeli. Pasek formuły pokazuje jej definicję, a pasek stanu na dole: 108 675 wierszy i 96 887 odrębnych wartości.

Dlaczego tak się dzieje

Kolumna obliczeniowa jest liczona przy przetwarzaniu modelu i zapisywana w każdym wierszu tabeli. Według dokumentacji Microsoft jej struktury powstają dopiero wtedy, gdy wszystkie tabele z Power Query są już wczytane, co wydłuża odświeżanie, a kompresja zwykle wychodzi słabsza niż przy kolumnie z Power Query. Dokumentacja kolumn obliczeniowych dodaje, że kolumny zapisane w modelu obciążają odświeżanie, bo ich wartości trzeba wyliczyć w jego trakcie. Miara nie zajmuje miejsca w tabeli i liczy się dopiero w zapytaniu wizualizacji, w jej kontekście filtra, czyli zestawie warunków z osi, fragmentatorów i filtrów. Różnicę omawiamy w lekcji o miarach i kolumnach obliczeniowych.

Kolumna obliczeniowa może też zależeć od innej tabeli. W modelu Nordvelli DimSklepy[Sprzedaż sklepu] sumuje FaktSprzedaz[WartoscNetto], a FaktZwroty[DataZakupu] szuka funkcją LOOKUPVALUE daty w FaktSprzedaz po SprzedazID. Obie zależności pokazuje funkcja INFO.CALCDEPENDENCY. Według dokumentacji wartości kolumn są przeliczane, gdy zmienią się dane, z których korzystają, więc nowe dane sprzedaży oznaczają też pracę w tabelach sklepów i zwrotów.

Co zrobić krok po kroku

  1. Znajdź wszystkie kolumny obliczeniowe. Otwórz Widok zapytań w języku DAX i uruchom zapytanie niżej. W modelu Nordvelli zwraca pięć kolumn: PierwszyDzienMiesiaca w DimKalendarz, dwie kolumny sprzedaży w DimSklepy, DataID w FaktBudzet i DataZakupu w FaktZwroty.
    EVALUATE
    SELECTCOLUMNS(
        FILTER(INFO.VIEW.COLUMNS(), [Type] = "Calculated"),
        "Tabela", [Table],
        "Kolumna", [Name]
    )
  2. Sprawdź, z czego korzystają. Zapytanie na INFO.CALCDEPENDENCY wypisuje kolumny obliczeniowe, które czytają kolumny innych tabel. W Nordvelli to FaktZwroty[DataZakupu] (z FaktSprzedaz[SprzedazID] i FaktSprzedaz[DataID]) oraz obie kolumny sprzedaży w DimSklepy (z FaktSprzedaz[WartoscNetto]). Razem to sześć wierszy, bo przy kolumnach DimSklepy pojawia się też wewnętrzna kolumna RowNumber tabeli FaktSprzedaz.
    EVALUATE
    SELECTCOLUMNS(
        FILTER(
            INFO.CALCDEPENDENCY(),
            [OBJECT_TYPE] = "CALC_COLUMN"
                && [REFERENCED_TABLE] <> [TABLE]
                && [REFERENCED_OBJECT_TYPE] = "COLUMN"
        ),
        "Kolumna", [TABLE] & "[" & [OBJECT] & "]",
        "Korzysta z", [REFERENCED_TABLE] & "[" & [REFERENCED_OBJECT] & "]"
    )
  3. Wartość, która ma się tylko wyświetlać albo sumować, zamień na miarę: prawy przycisk na tabeli w panelu Dane, Nowa miara. Miara brutto Nordvelli daje 566 064 985,73 zł, tyle co suma kolumny z tą samą formułą, a dla Nordvella Online 171 432 428,69 zł. Potem usuń kolumnę: prawy przycisk na nagłówku w widoku tabeli, Usuń, potwierdzenie Tak.
    Sprzedaż brutto =
    SUMX(
        FaktSprzedaz,
        FaktSprzedaz[WartoscNetto] * ( 1 + RELATED( DimProdukty[StawkaVAT] ) )
    )
  4. Wartość potrzebną we fragmentatorze, na osi albo w relacji, liczoną z kolumn tego samego wiersza, przenieś do Power Query: Dodaj kolumnę > Kolumna niestandardowa. Dokumentacja Microsoft zaleca taki krok zamiast kolumny DAX, a przy bazie danych jeszcze lepiej policzyć wartość w zapytaniu SQL albo zapisać ją w źródle. Tak można liczyć na przykład DataID w FaktBudzet, czyli Rok * 10000 + Miesiac * 100 + 1.
  5. Uważaj na kolumny, które szukają wartości w innej tabeli. Zamiana LOOKUPVALUE w FaktZwroty[DataZakupu] na scalenie w Power Query wymagałaby odwołania do zapytania FaktSprzedaz, a według dokumentacji Microsoft zapytanie z odwołaniem wykonuje kroki zapytania bazowego od nowa. W Nordvelli oznaczałoby to drugie uruchomienie skryptu Python z zapytania sprzedaży. Mechanizm opisujemy w poście o zapytaniach liczonych wiele razy. Tu lepsza jest data zakupu zapisana w źródle zwrotów albo pozostawienie kolumny.
  6. Kolumnę obliczeniową zostaw tam, gdzie formuła potrzebuje miary albo funkcji dostępnej tylko w DAX. Dokumentacja Microsoft wymienia taki przypadek wprost. W Nordvelli Sprzedaż sklepu z CALCULATE leży w DimSklepy, która ma 15 wierszy, więc jej koszt jest pomijalny. W tabeli faktów para takich kolumn kończy się zależnością cykliczną, o czym piszemy w poście o zależności cyklicznej.

Jak sprawdzić, że problem zniknął

Po zamianie porównaj sumy. Miara musi dać tę samą kwotę co usunięta kolumna, na modelu Nordvelli 566 064 985,73 zł. Rozmiar sprawdzisz w VertiPaq Analyzer: w lekcji o wydajności usunięcie jednej kolumny obliczeniowej zmniejszyło FaktSprzedaz z 8 412 166 do 4 359 794 bajtów, a plik .pbix z 8,4 MB do 7,1 MB. Czas odświeżania porównuj w tych samych warunkach, najlepiej z dwóch odświeżeń przed zmianą i dwóch po niej.

Żeby kolumny nie wracały, przed każdą nową kolumną DAX w tabeli faktów zadaj dwa pytania: czy wynik musi być zapisany w każdym wierszu i czy da się go policzyć w Power Query albo w źródle. Gdy pierwsza odpowiedź brzmi nie, wybierz miarę, a gdy druga brzmi tak, krok zapytania.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Data reduction techniques for Import modeling (Preference for custom columns) (źródło)
  • Microsoft Learn: Create calculated columns in Power BI Desktop (Materialization and performance) (źródło)
  • Microsoft Learn: Referencing Power Query queries (źródło)
  • Microsoft Learn: INFO.CALCDEPENDENCY function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: lista kolumn obliczeniowych, ich zależności oraz kolumna brutto porównana z miarą Sprzedaż brutto.

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

Kolumna obliczeniowa czy miara - co jest wydajniejsze w Power BI?
Miara nie zajmuje miejsca w modelu i liczy się dopiero w zapytaniu wizualizacji, a kolumna obliczeniowa jest wyliczana przy odświeżaniu i zapisywana w każdym wierszu. Dla wartości, które się tylko wyświetla albo sumuje, miara odciąża odświeżanie i zmniejsza model. W Nordvelli miara brutto daje tę samą sumę co kolumna z tą samą formułą, 566 064 985,73 zł.
Kiedy używać kolumny obliczeniowej w Power BI?
Gdy wartość musi być zapisana w każdym wierszu, na przykład do fragmentatora, osi albo relacji, a formuła potrzebuje miary albo funkcji dostępnej tylko w DAX. W małej tabeli wymiaru, takiej jak 15 sklepów Nordvelli, koszt takiej kolumny jest pomijalny. Wartości liczone z kolumn tego samego wiersza lepiej przenieść do Power Query albo do źródła.
Czy kolumna z Power Query jest lepsza niż kolumna obliczeniowa DAX?
Według dokumentacji Microsoft kolumna z Power Query zwykle kompresuje się lepiej, a kolumna DAX powstaje dopiero po wczytaniu wszystkich tabel, co wydłuża odświeżanie. Wyjątkiem są kolumny, które szukają wartości w innej tabeli, bo scalenie z innym zapytaniem wykonuje jego kroki drugi raz.
Jak znaleźć wszystkie kolumny obliczeniowe w modelu Power BI?
W widoku zapytań w języku DAX uruchom zapytanie na INFO.VIEW.COLUMNS z warunkiem, że kolumna Type ma wartość Calculated. Zwraca tabelę i nazwę każdej kolumny obliczeniowej. W modelu Nordvelli jest ich pięć, a funkcja INFO.CALCDEPENDENCY pokazuje, z których tabel korzystają.

Komentarze (0)

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

Brak komentarzy...