SQL pod Power BI: indeksy i zapytania, które przestają „mielić” bazę
Jak projektować indeksy i pisać zapytania SQL pod Power BI, by raporty działały szybciej i nie przeciążały bazy? Praktyczne wskazówki, które pomagają skrócić czas odświeżania i poprawić wydajność.
Jak zaprojektować indeksy w SQL, żeby raporty Power BI przestały mielić bazę?
Indeksy pod Power BI projektuje się nie „pod tabelę”, tylko pod rzeczywisty wzorzec zapytań generowanych przez raport: filtrowanie, łączenia i agregacje. Najważniejsze jest ustalenie, które kolumny najczęściej pojawiają się w klauzulach WHERE, JOIN i GROUP BY, a następnie zbudowanie indeksów tak, aby silnik mógł szybko zawęzić zakres danych zamiast skanować całe tabele. W praktyce oznacza to, że na dużych tabelach faktów klucz indeksu powinien zwykle zaczynać się od kolumn o wysokiej selektywności używanych w filtrach, a dopiero potem uwzględniać kolumny potrzebne do łączenia lub grupowania.
W raportach Power BI bardzo często krytyczne są filtry po dacie, identyfikatorach wymiarów, statusie oraz relacjach do tabel słownikowych. Jeśli zapytania regularnie filtrują dane po zakresie dat i jednym lub dwóch kluczach biznesowych, indeks złożony powinien odzwierciedlać właśnie tę kolejność dostępu. Kolejność kolumn w indeksie ma znaczenie: źle ustawiona może sprawić, że indeks formalnie istnieje, ale praktycznie nie pomaga. Nie warto też budować wielu podobnych indeksów o nieco innym układzie, bo zwiększają koszt zapisów i utrzymania, a często nie poprawiają odczytu.
Drugim elementem jest pokrycie zapytania. Jeżeli raport po znalezieniu wierszy musi jeszcze pobierać z tabeli dodatkowe kolumny miar lub atrybutów, silnik wykona dużą liczbę dodatkowych odczytów. Dlatego warto projektować indeksy tak, by oprócz klucza zawierały również kolumny najczęściej zwracane przez zapytania raportowe. Taki indeks nie musi przyspieszać wszystkiego, ale powinien odpowiadać najbardziej kosztownym i najczęściej wykonywanym zapytaniom.
Osobno trzeba traktować tabele wymiarów i tabele faktów. W wymiarach zwykle wystarczają indeksy na kluczach używanych w relacjach oraz ewentualnie na kolumnach filtrowanych przez użytkownika. W faktach znaczenie mają przede wszystkim indeksy pod odczyt masowy: dobrze dobrane pod filtry i grupowanie, a nie przypadkowo dodane na każdej kolumnie używanej w raporcie. Szczególnie ważne jest indeksowanie kluczy łączeń między faktami a wymiarami, bo to one często decydują, czy zapytanie przejdzie przez selektywny plan, czy przez kosztowny skan.
Jeśli baza obsługuje duże wolumeny danych i raporty wykonują agregacje na milionach wierszy, warto rozważyć indeksy zoptymalizowane pod analitykę, ale tylko wtedy, gdy pasują do charakteru obciążenia. W środowiskach mieszanych, gdzie obok odczytu występuje intensywny zapis, nadmiar lub zły typ indeksów może pogorszyć wydajność całości. Dlatego poprawny projekt nie polega na „dodaniu indeksów”, tylko na dopasowaniu ich do dominujących zapytań z Power BI i sprawdzeniu, czy plan wykonania faktycznie zamienił skan na seek lub ograniczył liczbę odczytów logicznych.
Najkrótsza praktyczna zasada jest taka: indeksuj kolumny filtrowane i łączone, ustawiaj ich kolejność zgodnie z rzeczywistym sposobem użycia w zapytaniach, ogranicz liczbę podobnych indeksów i testuj efekt na konkretnych planach wykonania. Dopiero taki indeks przestaje być ozdobą schematu i realnie odciąża bazę przy raportach Power BI.
Najczęściej zadawane pytania i odpowiedzi odnośnie SQL pod Power BI: indeksy i zapytania, które przestają „mielić” bazę
Najbardziej obciążają bazę te zapytania, które najczęściej filtrują, łączą i agregują duże zakresy danych. W praktyce trzeba sprawdzić, które wzorce pojawiają się regularnie w raportach i dla których plan wykonania pokazuje skany lub dużą liczbę odczytów logicznych. To właśnie pod te zapytania warto projektować indeksy, zamiast indeksować tabelę „na wszelki wypadek”.
Kolejność kolumn w indeksie decyduje o tym, czy silnik szybko zawęzi dane, czy nadal będzie skanował dużą część tabeli. Jeśli raport najpierw filtruje po dacie, a potem po kluczu wymiaru, indeks powinien odzwierciedlać ten sposób użycia. Sam fakt istnienia indeksu nie wystarczy, gdy jego układ nie pasuje do rzeczywistych warunków w zapytaniach.
Tak, tabele faktów i wymiary wymagają innego podejścia do indeksowania. W wymiarach zwykle wystarczą indeksy na kluczach relacji i kolumnach używanych przez filtry użytkownika. W tabelach faktów ważniejsze są indeksy wspierające masowy odczyt, filtrowanie i grupowanie. Różnica wynika z tego, że fakty obsługują ciężkie zapytania raportowe, a wymiary najczęściej dostarczają kontekst do łączeń.
Indeks pokrywający zawiera nie tylko kolumny wyszukiwania, ale też dane potrzebne do zwrócenia wyniku bez dodatkowych odczytów z tabeli. Dzięki temu silnik nie musi po znalezieniu wierszy wracać po kolejne atrybuty lub miary. To szczególnie ważne w raportach, które często wykonują te same kosztowne zapytania i przez to niepotrzebnie obciążają bazę.
Najczęstszy błąd to tworzenie indeksów bez odniesienia do realnych zapytań z raportów. W praktyce problemem są też źle ustawiona kolejność kolumn i nadmiar podobnych indeksów. Typowe błędy to:
- indeksowanie „pod tabelę”, a nie pod WHERE, JOIN i GROUP BY,
- budowanie wielu prawie identycznych indeksów,
- pomijanie kolumn potrzebnych do pokrycia zapytania,
- brak weryfikacji efektu w planie wykonania.
Poprawę widać wtedy, gdy plan wykonania ogranicza skanowanie i zmniejsza liczbę odczytów logicznych. Samo dodanie indeksu nie oznacza jeszcze zysku. Trzeba sprawdzić, czy zapytanie zaczęło korzystać z bardziej selektywnego dostępu do danych, na przykład przez seek, oraz czy raport przestał generować kosztowne odczyty na dużych tabelach faktów.
Zbyt wiele indeksów szkodzi wtedy, gdy baza oprócz odczytu obsługuje też intensywny zapis i utrzymuje wiele podobnych struktur. Każdy dodatkowy indeks zwiększa koszt modyfikacji danych i utrzymania. Problem pojawia się szczególnie wtedy, gdy indeksy różnią się tylko drobnym układem kolumn, ale nie dają wyraźnej poprawy dla najcięższych zapytań raportowych.
Najlepiej zacząć od analizy rzeczywistych zapytań i dopiero potem dobrać kilka indeksów pod najcięższe przypadki. Dobry punkt startowy obejmuje:
- sprawdzenie filtrów, łączeń i grupowań używanych przez raport,
- wytypowanie największych tabel faktów,
- ułożenie klucza indeksu zgodnie z kolejnością użycia kolumn,
- potwierdzenie efektu na planie wykonania.