Blog JSystems - uwalniamy wiedzę!

Szukaj
Infografika odświeżania przyrostowego w Power BI: parametry zakresu, filtr po dacie, polityka odświeżania i partycje w usłudze
Cztery kroki odświeżania przyrostowego. Parametry zakresu, filtr po dacie i politykę ustawiasz w Power BI Desktop, a partycje powstają dopiero w usłudze Power BI, przy pierwszym odświeżeniu po publikacji.

W skrócieOdświeżanie przyrostowe (incremental refresh) dzieli tabelę faktów na partycje po dacie i odświeża tylko najświeższe, zamiast za każdym razem przetwarzać wszystkie wiersze. Na danych Nordvelli z SQL Server ustawiamy RangeStart i RangeEnd, politykę archiwum, wykrywanie zmian i bramę danych, a po publikacji sprawdzamy partycje.

Lekcja 19 z 28 bezpłatnego kursu Power BI, od pierwszego raportu do Fabric i Copilota, na jednym zestawie danych sieci Nordvella.

<-- Spis wszystkich lekcji
<-- Lekcja 18: Optymalizacja wydajności modelu (VertiPaq)Lekcja 20: modele złożone, tryb Dual i agregacje -->

Tabela faktów Nordvelli, czyli FaktSprzedaz, ma 108 675 wierszy z lat 2022 do 2026 i rośnie z każdą transakcją w sieci sklepów. Gdy opublikujesz taki model w usłudze Power BI i ustawisz codzienne odświeżanie, domyślnie za każdym razem przetwarzane są wszystkie wiersze, także sprzedaż z 2022 roku, która od dawna się nie zmienia. To marnuje czas i obciąża bazę, a przy dużych tabelach zaczyna przekraczać limity odświeżania. Odświeżanie przyrostowe (po angielsku incremental refresh) rozwiązuje ten problem: Power BI dzieli tabelę na partycje po dacie i odświeża tylko te najświeższe.

W tym rozdziale zbudujemy odświeżanie przyrostowe od zera, na bazie Nordvelli w MS SQL Server. Dodasz parametry RangeStart i RangeEnd, założysz filtr daty, który składa się do bazy, ustawisz politykę archiwum i odświeżania z wykrywaniem zmian, opublikujesz model przez bramę danych, a na koniec sprawdzisz w usłudze, które partycje powstały i które się odświeżyły.

Z tej lekcji dowiesz się:

Pliki do tej lekcji

Gotowy efekt: plik Power BI Desktop w stanie z końca tej lekcji, z tymi samymi zapytaniami, modelem i stronami raportu, które widać na zrzutach. Plik łączy się z naszym serwerem 192.168.1.206,1433: u siebie zmień serwer w Przekształć dane, Ustawienia źródła danych.

Pobierz nordvella_19_incremental.pbix

Plik startowy: nie jest potrzebny. Odświeżanie przyrostowe budujemy na nowym, pustym pliku (Plik, Nowy) z danymi z bazy SQL Server, bo filtr okna czasu musi trafić do bazy. Na arkuszu Excel zapytanie się nie składa.

Dane źródłowe:
Nordvella.bak.gz - te same dane jako baza MS SQL Server (odtwarzasz poleceniem RESTORE DATABASE), do ćwiczeń z połączeniem z bazą SQL.

Pobierz Nordvella.bak.gz

Po co odświeżanie przyrostowe: skala danych i okno czasu

Co chcemy osiągnąć. Sprzedaży Nordvelli przybywa codziennie, a pełne odświeżanie za każdym razem czyta całą historię od 2022 roku. Chcemy, żeby model odświeżał tylko ostatni okres, a starych lat nie ruszał.

Zacznijmy od liczb, bo to one decydują, czy odświeżanie przyrostowe jest Ci potrzebne. FaktSprzedaz w Nordvelli ma 19 550 wierszy z 2022 roku, 21 747 z 2023, 26 164 z 2024, 29 545 z 2025 i 11 669 z pięciu miesięcy 2026 roku. Razem 108 675 wierszy. To model szkoleniowy. W dużej sieci sklepów taka tabela może rosnąć o dziesiątki tysięcy wierszy dziennie i po kilku latach liczyć dziesiątki milionów. Kluczowa obserwacja jest prosta: dane historyczne się nie zmieniają. Transakcja z marca 2022 roku jest zamknięta i codzienne wczytywanie jej od nowa to strata czasu.

Historia odświeżania modelu nordvella_19_incremental w usłudze Power BI: pierwsze odświeżenie 23 sekundy, drugie 5 sekund
Pomiar z tej lekcji, okno Historia odświeżania w usłudze. Pierwsze odświeżenie po publikacji (na dole) trwało od 21:12:03 do 21:12:26, bo budowało całą historię. Drugie (na górze) od 21:17:52 do 21:17:57, bo przebudowało jedną partycję. Na 108 tysiącach wierszy różnica to kilkanaście sekund, przy milionach wierszy decyduje o tym, czy odświeżanie w ogóle się zmieści.

Odświeżanie pełne za każdym razem czyta całe źródło. Odświeżanie przyrostowe czyta tylko okno czasu, w którym coś mogło się zmienić. Reszta tabeli, czyli partycje starszych okresów, zostaje z poprzedniego odświeżenia. Tabela pokazuje, co to znaczy dla FaktSprzedaz z ustawieniami z tej lekcji.

Tryb odświeżaniaCo przetwarza usługaU nas
Pełne (bez polityki)wszystkie wiersze FaktSprzedaz108 675 wierszy przy każdym odświeżeniu
Przyrostowe, okno 6 miesięcypartycje z okna odświeżaniamaj-październik 2026: z danymi tylko maj, 2 419 wierszy
Przyrostowe z wykrywaniem zmiantylko partycje okna, w których wzrósł znacznik modyfikacjipo zmianie jednej transakcji z maja: jedna partycja, około 5 s

Okno odświeżania ustawiliśmy na 6 miesięcy, bo dane Nordvelli kończą się 31 maja 2026 roku, a okno liczy się wstecz od dnia odświeżenia (u nas 16 października 2026). W sklepie, w którym sprzedaż przybywa codziennie, wystarczy kilka dni, na przykład 10.

Wskazówka: odświeżanie przyrostowe ma sens dla dużych tabel faktów z kolumną daty, takich jak FaktSprzedaz. Małe tabele wymiarów Nordvelli, DimSklepy (15 wierszy) czy DimProdukty (30 wierszy), zostaw w zwykłym odświeżaniu pełnym. Dzielenie 15 wierszy na partycje nic nie da, a tylko skomplikuje model.

Jak to działa: partycje i składanie zapytania

Co chcemy osiągnąć. Odświeżanie przyrostowe ustawiamy w Desktopie, ale działa ono dopiero w usłudze Power BI. Chcemy rozumieć ten mechanizm przed konfiguracją, bo bez tego trudno później ocenić, czy działa poprawnie.

Power BI dzieli FaktSprzedaz na partycje, czyli osobno przechowywane kawałki tabeli. Każda partycja obejmuje jeden przedział dat. Partycje starsze niż okno odświeżania są budowane raz i potem tylko odczytywane. Partycje z okna są przy każdym odświeżeniu budowane od nowa, więc łapią świeże i poprawione wiersze. Im starszy okres, tym grubsze partycje: Power BI łączy stare miesiące w kwartały, a kwartały w lata.

Lista 13 partycji tabeli FaktSprzedaz w usłudze Power BI po pierwszym odświeżeniu: lata 2021-2025, kwartał 2026Q1 i miesiące od 2026Q204 do 2026Q410
Tak usługa pocięła FaktSprzedaz przy polityce z tej lekcji (5 lat archiwum, 6 miesięcy okna). Lata 2021-2025 to po jednej partycji na rok, pierwszy kwartał 2026 to 2026Q1, a od kwietnia są partycje miesięczne: 2026Q204 to kwiecień w drugim kwartale, 2026Q410 to październik. Partycja 2021 jest pusta, bo sprzedaż zaczyna się w 2022 roku. Czasy w kolumnie Odświeżona są podane w UTC, 7:12 PM to 21:12 czasu polskiego. Zapytanie, które daje tę listę, pokazujemy w części o weryfikacji.

Cały ten podział napędza jedno zapytanie z filtrem daty. Dlatego parametry RangeStart i RangeEnd są sercem mechanizmu: usługa podstawia pod nie granice kolejnych partycji i wykonuje Twoje zapytanie osobno dla każdej partycji, którą buduje.

Infografika przepływu odświeżania w usłudze Power BI: harmonogram, usługa, brama danych, SQL Server Nordvelli, model semantyczny i raport
Przepływ odświeżania. Polecenie wychodzi z usługi, brama danych wykonuje zapytania Power Query w sieci firmy, SQL Server zwraca wiersze (przy składaniu tylko z okna dat), a model przetwarza tylko partycje z okna.

Jest jeden warunek, o którym trzeba wiedzieć od razu. Filtr RangeStart i RangeEnd musi zostać wykonany w bazie, a nie po pobraniu całej tabeli do Power BI. Takie przekazanie kroków do źródła to składanie zapytania (po angielsku query folding). Bez niego usługa i tak ściągnęłaby całą tabelę dla każdej partycji i dopiero potem ją przefiltrowała. Dla bazy SQL składanie działa, dla arkusza Excel go nie ma, dlatego w tej lekcji czytamy dane z SQL Server.

Składania nie trzeba przyjmować na wiarę. W edytorze Power Query kliknij prawym przyciskiem ostatni krok zapytania FaktSprzedaz i wybierz Wyświetl zapytanie natywne. Power BI pokaże SQL, który naprawdę wyśle do bazy. Jeśli w klauzuli where widzisz granice okna, filtr wykonuje się na serwerze. Jeśli ta pozycja menu jest wyszarzona, składanie urwało się wcześniej.

Okno Zapytanie natywne w Power Query: SELECT z tabeli FaktSprzedaz z warunkiem where na DataSprzedazy od 2026-01-01 do 2026-02-01
Dowód składania zapytania z naszego pliku. Filtr z parametrami zamienił się w warunek where [_].[DataSprzedazy] >= convert(datetime2, '2026-01-01 00:00:00') and [_].[DataSprzedazy] < convert(datetime2, '2026-02-01 00:00:00'). Baza odda tylko styczeń 2026, czyli 2 782 wiersze, a nie wszystkie 108 675.

Źródło: baza SQL z kolumną daty i znacznikiem modyfikacji

Co chcemy osiągnąć. Odświeżanie przyrostowe potrzebuje w tabeli faktów kolumny typu data i godzina, po której da się dzielić dane, a wykrywanie zmian dodatkowo kolumny ze znacznikiem ostatniej modyfikacji. Chcemy przygotować obie w bazie Nordvelli, zanim połączymy się z nią w Power BI.

Odtwórz bazę z pliku Nordvella.bak.gz z bloku Pliki do tej lekcji (rozpakuj go i użyj polecenia RESTORE DATABASE w SQL Server). FaktSprzedaz ma w niej tylko klucz DataID w postaci liczby RRRRMMDD, wskazujący na DimKalendarz. Filtr po kluczu z wymiaru nie wystarczy, dlatego kolumnę daty dokładamy w bazie, jako kolumnę obliczaną i utrwaloną:

ALTER TABLE dbo.FaktSprzedaz
    ADD DataSprzedazy AS
        CONVERT(datetime, CAST(DataID AS char(8)), 112) PERSISTED;

Styl 112 w CONVERT jest tu obowiązkowy. Sprawdziliśmy to na naszym serwerze: bez niego SQL Server odmawia z błędem 4936 („Computed column ... cannot be persisted because the column is non-deterministic”), bo konwersja bez jawnego stylu zależy od ustawień językowych sesji. Kolumnę daty można też zbudować w Power Query, scalając tabelę z DimKalendarz, ale wtedy filtr okna czasu nie złoży się do zapytania SQL. Dlatego robimy to w źródle.

Druga kolumna, OstatniaModyfikacja, posłuży do wykrywania zmian. Ma rosnąć przy każdej zmianie wiersza. Dla istniejących danych ustawiamy ją na datę zwrotu (bo zwrot to zmiana sprzedaży), a gdy zwrotu nie było, na datę sprzedaży. Nowe wiersze dostaną bieżący czas z wartości domyślnej, a każda późniejsza zmiana wiersza zaktualizuje znacznik przez wyzwalacz:

ALTER TABLE dbo.FaktSprzedaz
    ADD OstatniaModyfikacja datetime2(0) NULL;
GO

UPDATE f
SET OstatniaModyfikacja = COALESCE(z.OstatniZwrot, f.DataSprzedazy)
FROM dbo.FaktSprzedaz AS f
LEFT JOIN (
    SELECT SprzedazID,
           MAX(CONVERT(datetime2(0),
               CAST(DataZwrotu AS char(8)), 112)) AS OstatniZwrot
    FROM dbo.FaktZwroty
    GROUP BY SprzedazID
) AS z ON z.SprzedazID = f.SprzedazID;

ALTER TABLE dbo.FaktSprzedaz
    ALTER COLUMN OstatniaModyfikacja datetime2(0) NOT NULL;

ALTER TABLE dbo.FaktSprzedaz
    ADD CONSTRAINT DF_FaktSprzedaz_OstatniaModyfikacja
    DEFAULT SYSDATETIME() FOR OstatniaModyfikacja;
GO

CREATE TRIGGER dbo.TR_FaktSprzedaz_OstatniaModyfikacja
ON dbo.FaktSprzedaz AFTER UPDATE AS
BEGIN
    SET NOCOUNT ON;
    IF UPDATE(OstatniaModyfikacja) RETURN;
    UPDATE f SET OstatniaModyfikacja = SYSDATETIME()
    FROM dbo.FaktSprzedaz AS f
    JOIN inserted AS i ON i.SprzedazID = f.SprzedazID;
END;

Uruchom skrypt w całości, na przykład w SQL Server Management Studio. Słowo GO dzieli go na partie i jest tu potrzebne. Bez GO po pierwszym poleceniu SQL Server zgłasza błąd 207 „Invalid column name 'OstatniaModyfikacja'”, bo kompiluje całą partię, zanim doda kolumnę. Sprawdziliśmy oba warianty na kopii tabeli. Z podziałem na partie znacznik późniejszy niż data sprzedaży dostało 2 713 transakcji, czyli te, przy których był zwrot później niż w dniu zakupu (zwrotów jest 2 714, jeden ma datę zakupu). Liczba wierszy (108 675) i suma sprzedaży (467 775 009,17 zł) przed zmianą i po niej były takie same, bo kolumny dochodzą obok danych.

Teraz połączenie. W nowym, pustym pliku Power BI Desktop kliknij na karcie Narzędzia główne SQL Server. W polu Serwer wpisz adres swojego serwera, w polu Baza danych wpisz Nordvella, zostaw tryb Importuj i kliknij OK.

Okno Baza danych programu SQL Server w Power BI Desktop: serwer 192.168.1.206,1433, baza Nordvella, tryb łączności Importuj
Nasz serwer wpisujemy jako 192.168.1.206,1433, czyli adres i port po przecinku. To ma znaczenie przy publikacji: usługa dopasuje źródło do połączenia bramy danych tylko wtedy, gdy serwer i baza są zapisane tak samo jak w tym połączeniu. Tryb Importuj jest wymagany, odświeżanie przyrostowe dotyczy tabel importowanych.

W oknie Nawigator zaznacz FaktSprzedaz, DimSklepy i DimKalendarz. Zanim klikniesz dalej, sprawdź w podglądzie, czy FaktSprzedaz ma obie nowe kolumny. Podgląd bywa zapamiętany z wcześniejszego połączenia, więc odśwież go ikoną w prawym górnym rogu. Potem kliknij Przekształć dane, nie Załaduj: filtr założymy, zanim do modelu trafi cała tabela.

Okno Nawigator w Power BI: zaznaczone DimKalendarz, DimSklepy i FaktSprzedaz, w podglądzie kolumny DataSprzedazy i OstatniaModyfikacja
W podglądzie FaktSprzedaz, za kolumnami CzyZwrot, są DataSprzedazy i OstatniaModyfikacja z typem data i godzina. Ostatnie kolumny z wartościami Value i Table to relacje z innymi tabelami bazy, Power Query nie wczyta ich jako zwykłych kolumn.

Parametry RangeStart i RangeEnd w Power Query

Co chcemy osiągnąć. Usługa Power BI musi wiedzieć, od której do której daty odświeżać dane Nordvelli. Chcemy przygotować dwa parametry, przez które przekaże zapytaniu te granice.

W edytorze Power Query kliknij na karcie Narzędzia główne strzałkę przycisku Zarządzaj parametrami i wybierz Nowy parametr. Utworzysz dwa parametry o dokładnie tych nazwach: RangeStart i RangeEnd. Power BI rozpoznaje je po nazwie, więc literówka typu RangeStar sprawi, że polityka odświeżania nie będzie dostępna.

Dla każdego ustaw w oknie: Typ Data/godzina, Sugerowane wartości Dowolna wartość i niepustą Wartość bieżącą. Pole Wymagane zostaw zaznaczone. Wartość bieżąca służy tylko do podglądu w Desktopie, w usłudze silnik odświeżania podstawi własne granice. Ustaw RangeStart na 01.01.2026 00:00:00, a RangeEnd na 01.02.2026 00:00:00: w edytorze zobaczysz wtedy jeden miesiąc danych. Drugi parametr dodasz linkiem Nowy nad listą, bez zamykania okna.

Okno Zarządzaj parametrami w Power Query: parametr RangeStart typu Data/godzina, Dowolna wartość, wartość bieżąca 01.01.2026 00:00:00
Wypełnione okno pierwszego parametru. Muszą się zgadzać cztery rzeczy: nazwa dokładnie RangeStart, Typ Data/godzina, Sugerowane wartości Dowolna wartość i niepusta wartość bieżąca. Ikona przy nazwie zmienia się z ABC 123 na kalendarz, gdy wybierzesz typ.

Okno parametru zapisuje parametry jako zapytania w języku M. W naszym pliku wyglądają tak (rekord meta rozbiliśmy na linie, w pliku jest w jednej):

// RangeStart
#datetime(2026, 1, 1, 0, 0, 0) meta [
    IsParameterQuery=true,
    Type="DateTime",
    IsParameterQueryRequired=true
]

// RangeEnd
#datetime(2026, 2, 1, 0, 0, 0) meta [
    IsParameterQuery=true,
    Type="DateTime",
    IsParameterQueryRequired=true
]

Nie wpisujesz tego kodu ręcznie, generuje go okno parametru, ale warto wiedzieć, co powstaje. Po kliknięciu OK w panelu Zapytania po lewej pojawią się dwie nowe pozycje.

Panel Zapytania w Power Query: pod tabelami DimKalendarz, DimSklepy i FaktSprzedaz parametry RangeStart i RangeEnd kursywą z wartością w nawiasie
Pod trzema tabelami Nordvelli doszły dwie pozycje pisane kursywą, z inną ikoną i z wartością bieżącą w nawiasie. Tak Power Query oznacza parametry, które nie trafią do modelu jako tabele.

Wskazówka: parametry muszą być typu Data/godzina, nie Data ani Tekst. Gdy po ich utworzeniu w menu tabeli brakuje polecenia Odświeżanie przyrostowe albo jest ono niedostępne, sprawdź najpierw nazwy i typy obu parametrów.

Filtr daty na FaktSprzedaz według RangeStart i RangeEnd

Co chcemy osiągnąć. Chcemy połączyć parametry z tabelą FaktSprzedaz tak, żeby zapytanie pobierało tylko transakcje z zadanego okresu.

W panelu Zapytania kliknij FaktSprzedaz i znajdź kolumnę DataSprzedazy (jest daleko w prawo, najszybciej dojdziesz do niej poleceniem Wybieranie kolumn, Przejdź do kolumny). Kliknij strzałkę filtra w nagłówku kolumny, wybierz Filtry dat/godzin i na końcu listy Filtr niestandardowy.

Menu filtra kolumny DataSprzedazy w Power Query: rozwinięte Filtry dat/godzin z pozycją Filtr niestandardowy na końcu listy
Droga do właściwego okna. Gotowe filtry z tej listy (Rok, Miesiąc, Między) wpisują stałe daty i do odświeżania przyrostowego się nie nadają. Potrzebny jest Filtr niestandardowy, w którym wartości da się zastąpić parametrami.

W oknie Filtrowanie wierszy ustaw pierwszy warunek na jest po lub jest równe. Kliknij przełącznik typu między operatorem a polem wartości, wybierz Parametr i z listy RangeStart. Drugi warunek, połączony przez Oraz, ustaw na jest przed i parametr RangeEnd. Ta asymetria, od RangeStart włącznie do RangeEnd wyłącznie, sprawia, że wiersz z granicy dwóch partycji trafi tylko do jednej z nich.

Okno Filtrowanie wierszy dla DataSprzedazy: jest po lub jest równe RangeStart oraz jest przed RangeEnd, oba z przełącznikiem typu ustawionym na parametr
Oba warunki ustawione. Ikona między operatorem a wartością to przełącznik typu. Domyślnie pokazuje Data/godzina i wtedy wpisujesz konkretną datę. Po przełączeniu na Parametr lista podpowiada RangeStart i RangeEnd. Bez tego w kodzie wyląduje stała data i polityka odświeżania nie będzie miała czego podmieniać.

Po kliknięciu OK podgląd FaktSprzedaz skurczy się do stycznia 2026, a w panelu Zastosowane kroki dojdzie krok Przefiltrowano wiersze. Całe zapytanie FaktSprzedaz z naszego pliku wygląda tak (ostatni krok rozbiliśmy na linie, w Edytorze zaawansowanym jest w jednej):

let
    Źródło = Sql.Database("192.168.1.206,1433", "Nordvella"),
    dbo_FaktSprzedaz = Źródło{[Schema="dbo",Item="FaktSprzedaz"]}[Data],
    #"Przefiltrowano wiersze" = Table.SelectRows(
        dbo_FaktSprzedaz,
        each [DataSprzedazy] >= RangeStart and [DataSprzedazy] < RangeEnd
    )
in
    #"Przefiltrowano wiersze"
Edytor Power Query po filtrze: w kolumnie DataSprzedazy daty ze stycznia 2026, krok Przefiltrowano wiersze i formuła Table.SelectRows z RangeStart i RangeEnd
Efekt filtra. Pasek formuły pokazuje each [DataSprzedazy] >= RangeStart and [DataSprzedazy] < RangeEnd, pierwszy warunek z równością, drugi bez. Gdyby oba były z równością, wiersz z północy pierwszego dnia miesiąca trafiłby do dwóch partycji naraz.

Teraz kliknij Zamknij i zastosuj. Do modelu trafi tylko styczeń 2026: u nas 2 782 wiersze FaktSprzedaz i 11 798 138,92 zł sprzedaży. Tak ma być, pełną historię zbuduje dopiero usługa po publikacji.

Wskazówka: nie zmieniaj ręcznie operatora przy RangeEnd na mniejsze lub równe. Wiersze z granicy partycji zostałyby wtedy policzone dwa razy. Większe lub równe od dołu i ostro mniejsze od góry to jedyny bezpieczny kształt filtra dla polityki przyrostowej.

Polityka archiwum i odświeżania w Desktopie

Co chcemy osiągnąć. Chcemy ustalić, jak długą historię sprzedaży Nordvelli trzyma model i jaki ostatni okres ma się odświeżać przy każdym przebiegu.

W widoku raportu kliknij prawym przyciskiem tabelę FaktSprzedaz w panelu Dane i wybierz Odświeżanie przyrostowe. Obecność tej pozycji to szybki test wcześniejszych kroków: Power BI widzi parametry i filtr, który się do nich odwołuje.

Menu tabeli FaktSprzedaz w panelu Dane w Power BI Desktop: pozycja Odświeżanie przyrostowe między Zarządzanie relacjami a Zarządzaj agregacjami
Pozycja Odświeżanie przyrostowe w menu tabeli FaktSprzedaz, pod kursorem z podpowiedzią. Okno, które otwiera, ustawia politykę tylko dla tej jednej tabeli.

W oknie Odświeżanie przyrostowe i dane w czasie rzeczywistym włącz przełącznik Odśwież przyrostowo tę tabelę. Potem ustawiasz dwie liczby, które są sercem konfiguracji. Pierwsza to Rozpoczynanie archiwizowania danych: jak długą historię model przechowuje. Dane Nordvelli zaczynają się w 2022 roku, więc 5 lat obejmie całą historię. Druga to Uruchamianie odświeżania przyrostowego danych: ile ostatniego czasu usługa przetwarza przy każdym odświeżeniu. My ustawiamy 6 miesięcy, z powodu opisanego na początku rozdziału.

Okno Odświeżanie przyrostowe i dane w czasie rzeczywistym: ostrzeżenie o publikacji, tabela FaktSprzedaz, archiwum 5 lat i odświeżanie 6 miesięcy z wyliczonymi zakresami dat
Najcenniejsze są szare linijki pod polami: Power BI od razu przelicza liczby na daty. Dane zaimportowane od 1/1/2021 do 4/30/2026 i odświeżane przyrostowo od 5/1/2026 do 10/31/2026 (daty w zapisie miesiąc, dzień, rok). Ramka u góry ostrzega o rzeczy nieodwracalnej: po publikacji z tymi ustawieniami nie pobierzesz modelu z powrotem do Power BI Desktop.

Niżej, w części Wybierz ustawienia opcjonalne, są trzy pola. Pierwsze dotyczy danych w czasie rzeczywistym przez DirectQuery i jest dostępne tylko w warstwie Premium. Drugie, przy oknie w miesiącach opisane jako „Odświeżaj tylko pełne miesiący” (pisownia z okna Power BI), sprawia, że bieżący, niezakończony okres nie trafia do odświeżania, dopóki się nie skończy. Przy oknie liczonym w dniach to samo pole dotyczy pełnych dni. Trzecie to Wykryj zmiany danych: zaznacz je i z listy pod spodem wybierz kolumnę OstatniaModyfikacja.

Okno polityki odświeżania przyrostowego: zaznaczone Wykryj zmiany danych z kolumną OstatniaModyfikacja i oś czasu Zarchiwizowano oraz Odświeżanie przyrostowe
Wykrywanie zmian z kolumną OstatniaModyfikacja. Lista podpowiada dwie kolumny daty z FaktSprzedaz, DataSprzedazy i OstatniaModyfikacja. Część 4. Przejrzyj i zastosuj rysuje oś: szary odcinek to archiwum od 5 lat przed datą odświeżenia, zielony to 6 ostatnich miesięcy, które usługa przetwarza za każdym razem. Na koniec kliknij Zastosuj i zapisz plik.
Ustawienie politykiWartość w NordvelliSkutek
Rozpoczynanie archiwizowania danych5 latarchiwum od 1/1/2021 do 4/30/2026, budowane raz
Uruchamianie odświeżania przyrostowego danych6 miesięcyokno od 5/1/2026 do 10/31/2026, przetwarzane przy każdym odświeżeniu
Wykryj zmiany danychkolumna OstatniaModyfikacjaz okna odświeżane tylko partycje, w których wzrósł znacznik
Odświeżaj tylko pełne miesiącewyłączonebieżący miesiąc odświeżany od razu, choć się jeszcze nie skończył

Wskazówka: okres archiwum musi być dłuższy niż okno odświeżania. Gdy raport porównuje rok do roku (funkcje analizy czasu z lekcji 16), archiwum musi obejmować co najmniej dwa pełne lata, inaczej porównanie z poprzednim rokiem nie będzie miało danych.

Wykrywanie zmian danych (detect data changes)

Co chcemy osiągnąć. Nie w każdym miesiącu okna przybywa albo zmienia się sprzedaż, a usługa bez wykrywania zmian i tak przebudowuje wszystkie partycje okna. Chcemy, żeby odświeżała tylko te, w których dane naprawdę się zmieniły.

Samo okno odświeżania to już duża oszczędność, ale można pójść dalej. Wykrywanie zmian danych sprawia, że przed przebudową każdej partycji z okna Power BI pyta źródło o maksymalną wartość wybranej kolumny w tej partycji i porównuje ją z wartością zapamiętaną przy poprzednim odświeżeniu. Jeśli maksimum się nie zmieniło, partycja jest pomijana. Zapytanie sprawdzające Power BI zapisuje w modelu sam. W naszym pliku wygląda tak (w modelu jest w jednej linii, tu rozbite dla czytelności):

let
    MaxOstatniaModyfikacja = List.Max(FaktSprzedaz[OstatniaModyfikacja]),
    accountForNull =
        if MaxOstatniaModyfikacja = null
        then #datetime(1901, 01, 01, 00, 00, 00)
        else MaxOstatniaModyfikacja
in
    accountForNull

Czytaj to tak: weź największą wartość OstatniaModyfikacja w partycji, a jeśli partycja jest pusta, użyj stałej daty z 1901 roku. Puste partycje okna (u nas czerwiec-październik 2026) dają więc zawsze tę samą wartość i przy kolejnych odświeżeniach są pomijane. Wybór DataSprzedazy jako kolumny zmian nie miałby sensu: lista w oknie go dopuszcza, ale data starej transakcji się nie zmienia, więc korekta takiej transakcji nie zostałaby wykryta.

Wskazówka: wykrywanie zmian działa tylko wtedy, gdy znacznik jest wiarygodny i rośnie przy każdej modyfikacji. Jeśli w źródle korekta wiersza nie aktualizuje znacznika, usługa uzna partycję za niezmienioną i pominie poprawkę. Dlatego w tej lekcji znacznik ustawia wyzwalacz w bazie, a nie aplikacja, która mogłaby o tym zapomnieć.

Publikacja, brama danych i pierwsze odświeżenie

Co chcemy osiągnąć. Polityka zaczyna działać dopiero w usłudze Power BI. Chcemy opublikować model Nordvelli, połączyć go z bazą przez bramę danych i uruchomić pierwsze odświeżenie, które zbuduje partycje.

Polityka jest zapisana w modelu, ale partycje jeszcze nie istnieją. Zapisz plik, kliknij na karcie Narzędzia główne Opublikuj i wybierz obszar roboczy, u nas Nordvella Zarzad. Ponieważ źródłem jest serwer w sieci firmowej, Power BI Desktop zakończy publikację takim komunikatem:

Komunikat Power BI Desktop: Plik został opublikowany, ale odłączono go, z przyciskiem Otwórz ustawienia zestawu danych
Plik został opublikowany, ale odłączono go. Model jest już w usłudze, tylko usługa nie ma jeszcze drogi do serwera SQL w sieci firmy. Przycisk Otwórz ustawienia zestawu danych prowadzi prosto do miejsca, w którym to naprawisz.

Usługa działa w chmurze i nie widzi serwera 192.168.1.206. Most między nimi to lokalna brama danych (po angielsku on-premises data gateway), program zainstalowany na komputerze w sieci firmy. Instalację i rejestrację bramy omawiamy w lekcji 24. U nas brama Brama-Nordvella działa na maszynie POWERBI-KURS i ma już połączenie Nordvella SQL z serwerem 192.168.1.206,1433 i bazą Nordvella.

W ustawieniach modelu semantycznego rozwiń Połączenia bramy i chmury. Zaznacz bramę na liście, a w wierszu źródła danych wybierz z listy Mapowane na połączenie z tym samym serwerem i bazą. Kliknij Zastosuj.

Ustawienia modelu semantycznego w usłudze Power BI: sekcja Połączenia bramy i chmury, zaznaczona brama Brama-Nordvella i źródło SqlServer zmapowane na Nordvella SQL
Brama Brama-Nordvella ze stanem Działa na maszynie POWERBI-KURS. Źródło modelu SqlServer{"server":"192.168.1.206,1433","database":"nordvella"} zmapowane na połączenie Nordvella SQL. Lista Mapowane na podpowiada tylko połączenia bramy z pasującym serwerem i bazą.

Sprawdź skutek, zanim przejdziesz dalej. U nas pierwsza próba odświeżenia zakończyła się komunikatem „Odświeżanie nie powiodło się, ponieważ ten model semantyczny wymaga bramy”, więc powiązanie trzeba było zapisać jeszcze raz. Po ponownym zapisie lista źródeł modelu pokazywała już identyfikator bramy.

Teraz pierwsze odświeżenie. W obszarze roboczym najedź na model semantyczny nordvella_19_incremental i kliknij ikonę Odśwież teraz obok nazwy. Przy publikacji w Desktopie był jeden miesiąc danych, a pierwsze odświeżenie w usłudze zbuduje wszystkie partycje, od archiwum po okno.

Lista obszaru roboczego Nordvella Zarzad: raport i model semantyczny nordvella_19_incremental, przy modelu ikona Odśwież teraz z podpowiedzią
Odświeżenie na żądanie to ikona z okrągłą strzałką obok nazwy modelu, widoczna po najechaniu na wiersz. Obok jest Zaplanuj odświeżanie i Więcej opcji z resztą poleceń modelu, między innymi Historia odświeżania i Otwórz w widoku zapytania DAX.

Pierwsze odświeżenie trwało u nas 23 sekundy. Po nim raport w usłudze pokazuje pełną historię, choć w opublikowanym pliku był tylko styczeń 2026:

Te same karty raportu w Power BI Desktop i w usłudze Power BI: 12 mln zł i 3 tys. transakcji w Desktopie oraz 468 mln zł i 109 tys. w usłudze
Ten sam raport, dwa miejsca. W Desktopie model ma tylko okno parametrów (styczeń 2026): 12 mln zł i 3 tys. transakcji. W usłudze, po pierwszym odświeżeniu, model ma całą historię: 468 mln zł i 109 tys. transakcji, czyli wszystkie 108 675 wierszy. Czerwone plakietki nad zrzutami dodaliśmy my.

Weryfikacja partycji po publikacji

Co chcemy osiągnąć. Chcemy sprawdzić, że odświeżanie przyrostowe modelu Nordvelli naprawdę działa: że partycje powstały i że kolejne odświeżenie przebudowuje tylko to, co powinno.

Pierwszy, prosty dowód to historia odświeżania (Więcej opcji przy modelu, Historia odświeżania), którą pokazaliśmy na początku rozdziału. Dokładniejszy to lista partycji. Przy modelu kliknij Więcej opcji i wybierz Otwórz w widoku zapytania DAX. W edytorze wpisz zapytanie, które wybiera partycje tabeli FaktSprzedaz, i kliknij Uruchom. Poniżej jest w takiej postaci, w jakiej ułożył je przycisk Format:

EVALUATE
    VAR Fakt = SELECTCOLUMNS(
        FILTER(
            INFO.TABLES(),
            [Name] = "FaktSprzedaz"
        ),
        "ID", [ID]
    )
    RETURN
        SELECTCOLUMNS(
            FILTER(
                INFO.PARTITIONS(),
                [TableID] IN Fakt
            ),
            "Partycja", [Name],
            "Odświeżona", [RefreshedTime]
        )
    ORDER BY [Partycja]
Widok zapytań DAX w usłudze Power BI dla modelu nordvella_19_incremental: zapytanie z INFO.PARTITIONS i wyniki z nazwami partycji i czasem odświeżenia
Widok zapytań DAX w usłudze Power BI, na opublikowanym modelu. Pasek u góry przypomina o skutku polityki: w usłudze nie można użyć poleceń Pobierz dane ani Przekształć dane, dopóki model ma zasady odświeżania przyrostowego. Wynik ma 13 wierszy, po jednym na partycję.

Funkcje INFO.TABLES i INFO.PARTITIONS czytają metadane modelu, więc potrzebują uprawnień do jego edycji. W widoku zapytań DAX usługi zadziałały u nas od razu. To samo zapytanie wysłane przez interfejs API (executeQueries) skończyło się błędem, zadziałały tam tylko funkcje INFO.VIEW.

Teraz sprawdźmy wykrywanie zmian. W bazie zmieniamy jedną transakcję z 20 maja 2026 tak, żeby wyzwalacz zaktualizował jej znacznik, ale wartości zostały te same:

UPDATE dbo.FaktSprzedaz
SET KanalSprzedazy = KanalSprzedazy
WHERE SprzedazID = 107749;

Po tym poleceniu OstatniaModyfikacja transakcji 107749 zmieniła się z 2026-05-20 00:00:00 na 2026-10-16 19:17:21 (serwer SQL liczy czas w UTC). Drugie odświeżenie w usłudze trwało około 5 sekund (od 21:17:52 do 21:17:57 w historii odświeżania). Zapytanie o partycje uruchomione ponownie pokazuje, co zrobiła usługa:

Lista partycji FaktSprzedaz w usłudze Power BI po pierwszym odświeżeniu i po zmianie jednej transakcji z maja: nowy czas odświeżenia ma tylko partycja 2026Q205
Zmienił się jeden wiersz: partycja 2026Q205, czyli maj, ma nowy czas 7:17:55 PM. Archiwum (lata, 2026Q1, kwiecień) zostało nietknięte, a puste miesiące okna, od czerwca do października, wykrywanie zmian pominęło, bo ich znacznik się nie zmienił. Czerwone plakietki nad zrzutami dodaliśmy my.

Wskazówka: jeśli po każdym odświeżeniu wszystkie partycje dostają ten sam, świeży czas, coś odświeża się w całości. Najczęstsza przyczyna to filtr, który nie składa się do źródła. Wróć do edytora Power Query i sprawdź na ostatnim kroku FaktSprzedaz, czy pozycja Wyświetl zapytanie natywne jest dostępna.

Częste pułapki i lista kontrolna wdrożenia

Co chcemy osiągnąć. Chcemy wdrożyć odświeżanie przyrostowe w Nordvelli bez błędów, na których traci się najwięcej czasu, i mieć listę do odhaczenia przed publikacją modelu.

Odświeżanie przyrostowe działa, dopóki wszystkie elementy do siebie pasują. Najwięcej czasu zabierają powtarzalne błędy w kilku miejscach. Pierwsze z nich to składanie zapytania.

Dwa menu kroku w Power Query: Wyświetl zapytanie natywne wyszarzone po utracie składania i aktywne, gdy krok się składa
Składanie zapytania widać w menu kroku. Po prawej, na kroku Nawigacja, pozycja Wyświetl zapytanie natywne jest aktywna, więc Power Query nadal wysyła pracę do serwera. Po lewej, na kroku dodanym później, jest wyszarzona: od tego miejsca reszta liczy się lokalnie, na wszystkich wierszach pobranych z bazy. Sprawdzaj to zawsze na ostatnim kroku zapytania.
ObjawPrzyczyna i naprawa
W menu tabeli brakuje polecenia Odświeżanie przyrostoweParametry mają złą nazwę albo typ. Muszą się nazywać RangeStart i RangeEnd, mieć typ Data/godzina i być użyte w filtrze tabeli.
Odświeżanie dalej trwa długoFiltr nie składa się do źródła. Sprawdź Wyświetl zapytanie natywne na ostatnim kroku. Arkusz Excel nie składa zapytań, potrzebna jest baza.
Zdublowane wiersze na styku okresówZły operator przy RangeEnd. Ma być ostro mniejsze, nie mniejsze lub równe.
Porównanie rok do roku zwraca puste wartościZa krótki okres archiwum. Ustaw co najmniej dwa pełne lata.
Po publikacji: plik został opublikowany, ale odłączono goUsługa nie ma drogi do serwera w sieci firmy. Zmapuj źródło na połączenie lokalnej bramy danych z tym samym serwerem i bazą.
Odświeżanie nie powiodło się, bo model wymaga bramyPowiązanie z bramą się nie zapisało. Otwórz Połączenia bramy i chmury, zaznacz bramę, zmapuj źródło i zapisz jeszcze raz.
Korekty w źródle nie pojawiają się w raporcieZnacznik modyfikacji nie rośnie przy zmianie wiersza albo poprawka dotyczy okresu spoza okna odświeżania.
Infografika: sześć rzeczy do sprawdzenia przed wdrożeniem odświeżania przyrostowego w Power BI
Lista kontrolna przed wdrożeniem. Każdy punkt odpowiada jednemu z problemów z tabeli powyżej.

Przed publikacją modelu Nordvelli na produkcję sprawdź więc: parametry RangeStart i RangeEnd istnieją, mają typ Data/godzina i są użyte w filtrze FaktSprzedaz z operatorami większe lub równe od dołu i ostro mniejsze od góry. Okres archiwum jest dłuższy niż okno odświeżania i obejmuje historię potrzebną do porównań rok do roku. Kolumna wykrywania zmian jest osobna od kolumny podziału i rośnie przy każdej modyfikacji. Źródło to baza, która składa zapytania, a model w usłudze jest powiązany z bramą danych. Po publikacji drugie odświeżenie jest wyraźnie krótsze od pierwszego, a lista partycji potwierdza, że archiwum się nie zmienia.

✕

Najczęściej zadawane pytania

Czym jest odświeżanie przyrostowe w Power BI?
To mechanizm, w którym usługa Power BI dzieli tabelę faktów na partycje po dacie i przy każdym odświeżeniu przetwarza tylko partycje z ostatniego okresu. Starsze partycje zostają z poprzedniego odświeżenia. Na danych Nordvelli pierwsze odświeżenie zbudowało 13 partycji w 23 sekundy, a kolejne, po zmianie jednej transakcji, przebudowało tylko partycję maja w około 5 sekund.
Do czego służą parametry RangeStart i RangeEnd?
To dwa parametry Power Query typu Data/godzina o dokładnie tych nazwach. Filtr tabeli faktów odwołuje się do nich warunkiem [DataSprzedazy] >= RangeStart and [DataSprzedazy] < RangeEnd. W Desktopie wyznaczają podgląd (u nas styczeń 2026, 2 782 wiersze), a w usłudze Power BI podstawia za nie granice kolejnych partycji.
Czym różni się archiwizacja od odświeżania w polityce przyrostowej?
Okres archiwizacji mówi, jak długą historię model przechowuje, a okres odświeżania, które najnowsze partycje są przetwarzane przy każdym odświeżeniu. Przy archiwum 5 lat i oknie 6 miesięcy okno polityki wypisało zakresy: dane zaimportowane od 1/1/2021 do 4/30/2026 i odświeżane przyrostowo od 5/1/2026 do 10/31/2026.
Kiedy warto włączyć wykrywanie zmian danych?
Gdy w źródle jest kolumna, która rośnie przy każdej zmianie wiersza, na przykład OstatniaModyfikacja ustawiana przez wyzwalacz w bazie. Power BI sprawdza wtedy maksimum tej kolumny w każdej partycji z okna odświeżania i przebudowuje tylko te, w których wzrosło. Kolumna musi być wiarygodna, inaczej poprawki w źródle zostaną pominięte.
Dlaczego po publikacji model z bazą lokalną się nie odświeża?
Usługa nie dosięgnie serwera w sieci firmowej bez lokalnej bramy danych. Power BI Desktop pokazuje wtedy komunikat, że plik został opublikowany, ale odłączono go. W ustawieniach modelu semantycznego, w sekcji Połączenia bramy i chmury, wybierz bramę i zmapuj źródło na połączenie z tym samym serwerem i bazą, u nas 192.168.1.206,1433 i Nordvella.

Komentarze (0)

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

Brak komentarzy...