Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - Wydajność modelu i raportu
Wolna miara DAX z FILTER na całej tabeli - prosty warunek w CALCULATE
Wzorzec CALCULATE z FILTER na całej tabeli faktów łatwo przepisać z gotowego przykładu i powielić w kilkunastu miarach. Wolna miara z FILTER to wtedy tylko część kłopotu, bo w niektórych wizualizacjach taki zapis daje też inny wynik niż prosty warunek. Wyjaśniamy, dlaczego DAX FILTER jest wolny na całej tabeli i jak go zastąpić. Wszystkie warianty sprawdziliśmy na modelu Nordvelli.
W Analizatorze wydajności wizualizacja z taką miarą ma wysoki czas Zapytanie DAX, a nie wyświetlania. Na modelu Nordvelli ze 108 675 wierszami różnicy nie zobaczysz: w lekcji o wydajności cała tabela siedmiu miar, w tym obu wersji miary sprzedaży kartą, liczyła się 159 ms, z czego zapytanie DAX trwało 34 ms. Koszt pojawia się na tabelach z milionami wierszy i w macierzach, które wywołują miarę tysiące razy.
Drugi objaw to różne liczby. W tabeli z kolumną FormaPlatnosci na wierszach miara z FILTER pokazuje 187 035 097,78 zł tylko przy Karcie i pustkę przy BLIK, Gotówce, Przelewie i Ratach, a miara z prostym warunkiem pokazuje tę samą kwotę w każdym wierszu.

FILTER zwraca tabelę i według dokumentacji Microsoft sprawdza warunek dla każdego wiersza tabeli, którą dostaje. Gdy tą tabelą jest FaktSprzedaz, silnik przechodzi wszystkie wiersze faktów widoczne w bieżącym kontekście filtra, czyli zestawie warunków z wizualizacji. Prosty warunek, na przykład FaktSprzedaz[FormaPlatnosci] = "Karta", silnik traktuje jak filtr jednej kolumny, a tabele trybu Import to magazyny kolumnowe zoptymalizowane właśnie pod takie filtrowanie.
Wyniki różnią się z dwóch powodów. Prosty warunek podmienia filtr na swojej kolumnie, dlatego w wierszu BLIK liczy sprzedaż kartą. FILTER na tabeli zwraca tylko wiersze już widoczne w kontekście, więc filtr wiersza zostaje. Z tego samego powodu tabela z FILTER przenosi filtry z wymiarów. W mierze udziału sklepu w sprzedaży kartą z REMOVEFILTERS(DimSklepy) w tym samym CALCULATE wersja z FILTER dała 100% dla każdego sklepu, a wersja z prostym warunkiem poprawne udziały, na przykład 30,16% dla Nordvella Online i 7,58% dla Nordvella Warszawa Centrum. Więcej o mianownikach udziałów piszemy w poście o udziale procentowym w DAX.
Zobacz też: Szkolenie Analiza Power BI - DAX + M
Sprzedaż karta (wolno) i Sprzedaż premium. Nie każda jest błędem: FILTER na małej tabeli wartości albo z warunkiem na mierze bywa konieczny. Przepisujesz FILTER na całej tabeli faktów z warunkiem na jej kolumnie.EVALUATE
SELECTCOLUMNS(
FILTER(
INFO.VIEW.MEASURES(),
SEARCH("FILTER(", SUBSTITUTE([Expression], " ", ""), 1, 0) > 0
),
"Tabela", [Table],
"Miara", [Name]
)Sprzedaż karta =
CALCULATE(
SUM(FaktSprzedaz[WartoscNetto]),
FaktSprzedaz[FormaPlatnosci] = "Karta"
)Sprzedaż karta (zachowaj filtr) =
CALCULATE(
SUM(FaktSprzedaz[WartoscNetto]),
KEEPFILTERS(FaktSprzedaz[FormaPlatnosci] = "Karta")
)FaktSprzedaz[MarzaNetto] > FaktSprzedaz[WartoscNetto] * 0.2. Na Nordvelli ten zapis i FILTER na całej tabeli dały tę samą kwotę, 180 940 188,59 zł. Kolumn z dwóch tabel w prostym warunku użyć nie można. Silnik odpowiada: „Wyrażenie zawiera kolumny z wielu tabel, ale w wyrażeniu logicznym (True/False), które jest używane jako wyrażenie filtru tabeli, można użyć kolumn tylko z jednej tabeli.” (w angielskiej wersji: „The expression contains columns from multiple tables, but only columns from a single table can be used in a True/False expression that is used as a table filter expression.”).Karta lub telefony =
CALCULATE(
[Łączna sprzedaż],
FILTER(
CROSSJOIN(
VALUES(FaktSprzedaz[FormaPlatnosci]),
VALUES(DimProdukty[Kategoria])
),
FaktSprzedaz[FormaPlatnosci] = "Karta"
|| DimProdukty[Kategoria] = "Telefony"
)
)FILTER(VALUES(DimProdukty[Nazwa]), [Marża %] > 0.2) sprawdza 30 wartości, po jednej na produkt, zamiast 108 675 transakcji. Na Nordvelli warunek spełnia 17 produktów, które dały 230 240 963,80 zł sprzedaży.Przed usunięciem starej miary połóż obie wersje w jednej tabeli i sprawdź je na dwóch układach: z kolumną, której dotyczy warunek (tu FormaPlatnosci), i z inną, na przykład kategorią. W lekcji o wydajności robimy to na osobnej stronie Wydajność miar. Gdy liczby się zgadzają, zmierz wizualizację w Analizatorze wydajności, skopiuj zapytanie przyciskiem Kopiuj zapytanie i porównaj czas silnika formuł przed zmianą i po niej w DAX Studio, w widoku Server Timings.
Żeby wzorzec nie wracał, przyjmij w zespole jedną regułę zapisu: warunek na kolumnie zawsze wprost albo w KEEPFILTERS, a FILTER tylko na małej tabeli wartości i tylko wtedy, gdy warunek zawiera miarę albo kolumny z różnych tabel.
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
Komentarze (0)
Brak komentarzy...