Szymon Słupik dyrektor ds. technologii CDN S.A. grupa Comarch OLAP w praktyce Szymon Słupik dyrektor ds. technologii CDN S.A. grupa Comarch
CDN XL – nasz flagowy produkt
CDN XL – nasz flagowy produkt Podsystem „Controlling” Rozwiązanie klasy Business Intelligence 100% implementacji w oparciu o Microsoft Analysis Services 2000 Ponad 70 wymiarów współdzielonych Kilkanaście kostek dziedzinowych Pełna implementacja zapisu do kostek (writeback) Dział aplikacji Business Intelligence Hurtownie danych <pod klucz>, powiązane z systemami analitycznymi opartymi o Microsoft Analysis Services
Plan Optymalizacja konstrukcji kostek OLAP Wymiary, fakty i schemat gwiazdy Wymiar czasu Optymalizacja pracy serwera OLAP Zarządzanie pamięcią Agregacje Bezpieczeństwo danych
Wymiary: prywatne i współdzielone Wymiary – prywatne czy współdzielone? Prywatne – są zawsze przetwarzane z kostką Współdzielone – procesowane wtedy, gdy jest to konieczne Hierarchie – czy warto? Zalecenie: wymiary współdzielone z hierarchiami Nie da się zmienić prywatnego na współdzielony Decydując się na wymiar prywatny trudno przewidzieć czy kiedyś nie będzie potrzeby wykorzystania go w kilku kostkach Zmiana nazwy wymiaru (wprowadzenie hierarchii) jest kosztowna (przeróbki istniejących raportów)
Wymiary - konstrukcja Gdzie nas obciążają? Jak optymalizować? Pamięć Etap procesowania kostek (JOINy do faktów) Jak optymalizować? Unikalne klucze (member keys) Klucze numeryczne, nie znakowe Wymiary wielopoziomowe / hierarchie Pełny płatek śniegu Osobne tabele dla każdego poziomu Więzy integralności – programowanie defensywne
Wymiar czas – podejście tradycyjne Kolumna <datetime> w tabeli faktów Wizard automatycznie buduje wymiar czasu Zalety Prostota rozwiązania, wsparcie w narzędziach Metoda podawana na większości szkoleń dla początkujących Wady Budowa wymaga skanowania całej tabeli faktów Brak osi czasu dla prognoz / budżetowania Problemy związane z funkcją ParallelPeriod Gdy rok nie zaczyna się od 1go stycznia
Wymiar czas – podejście profesjonalne Osobna tabela np. WYM_Czas Generowana procedurą składowaną sp_generuj_czas <od> <do> Relacja FKT.Dzien_ID<<->WYM_Czas.Dzien_ID Zalety Możemy wygenerować oś czasu za dowolny okres Unikamy problemów z ParallelPeriod Mamy podstawę czasu do prognozowania i budżetowania Wady Większa komplikacja rozwiązania
Wymiar czas: po polsku
Optymalizacja schematu W hurtowni danych Indeks na każdym PK i FK W serwerze OLAP “Optimize Schema” w celu minimalizacji JOINów SELECT Dim1.dim1key, Dim2.dim2key, Dim3.dim3key, FactTable.meas1, FactTable.meas2, FROM FactTable, Dim1, Dim2, Dim3 WHERE (FactTable.dim1key=Dim1.dim1key) AND (FactTable.dim2key=Dim2.dim2key) AND (FactTable.dim3key=Dim3.dim3key) SELECT FactTable.dim1key, FactTable.dim2key, FactTable.dim3key, FactTable.meas1, FactTable.meas2, FROM FactTable
Optymalizacja schematu kostki Jest możliwa gdy… Wymiar jest współdzielony Kolumna „Member Key” na najniższym poziomie wymiaru jest zgodna z kluczem zastosowanym w tabeli faktów Kolumna „Member Key” na najniższym poziomie jest unikalna Najniższy poziom wymiaru w kostce nie jest wyłączony (disabled)
Optymalizacja agregacji Wymiary - Depends on Dimension property W edytorze wymiarów Wpływa na optymalizację agregatów wymiarów zależnych Kostki - usage-based optimization Serwer zapisuje dziennik zapytań (query log) Usage-based optimization kreuje najefektywniejszy zestaw agregatów używanych dla większości zapytań Błąd konstrukcyjny – w przypadku >64 wymiarów
Co mamy w pamięci? Wymiary… Jak sobie z tym radzić? …są ładowane do pamięci przy starcie serwera …wszystkie …ze wszystkich baz na serwerze …razem z właściwościami (member properties) Jak sobie z tym radzić? Uważać na member properties - np. URL:Char(256) Odpinać nieużywane bazy (np. kopie testowe itp.) Wymiary wirtualne nie obciążają pamięci Są agregowane w locie, niezła wydajność przy niskiej kardynalności (niewiele elementów)
Procesowanie kostek Faza bazowa Faza indeksowania Faza agregacji Odczytuje dane z serwera SQL Sortuje dane w pamięci Zapisuje dane w 64 KB segmentach na dysku Faza indeksowania Odczytuje segmenty danych i buduje indeksy Faza agregacji Budowa agregatów w pamięci W przypadku braku pamięci wykorzystanie pliku TMP
Co mamy w pamięci? Bufor procesowania Zwiększa wydajność wszystkich faz procesowania W fazie bazowej akumuluje rekordy Zwiększa ilość wierszy w segmencie Pozwala na lepszą kompresję danych Faza indeksacji i agregacji Więcej pamięci do wyliczania agregatów Zmniejsza wykorzystanie plików tymczasowych Ustawiany we właściwościach serwera
Co mamy w pamięci? O ile zwiększać bufor procesowania Za duży powoduje paging pamięci (OS) Za mały generuje pliki tymczasowe (AS) Wymiary Bufor Read Ahead Bufor Procesowania Pamięć serwera Analysis Services
Miara <Distinct Count> Distinct Count jest miarą nieaddytywną Na każdym poziomie musi być wyliczana na podstawie faktów bazowych i tam jest zapamiętywana Podstawowa zasada – nie mieszać Dodanie miary DC do kostki mającej inne miary powoduje eksplozję agregatów Dla miar DC robimy oddzielne, dedykowane kostki, spinane z kostką główną poprzez mechanizm kostek wirtualnych Ograniczenie W kostce może być tylko 1 miara DC
Metoda przetwarzania kostek Process database Przetwarza całą bazę danych, w jednej transakcji Zalecana metoda Wymaga 2xRAM, 2xDysk Process dimension + process cube Przetworzenie wymiaru może skutkować inwalidacją kostek i brakiem dostępności danych analitycznych Dobra metoda do diagnostyki problemów
Hurtownia i kostki (teoria) Na jednej maszynie + Brak konieczności transferu danych przez sieć + Hurtownia nie obciąża serwera OLTP - Rywalizacja o zasoby między SQL i OLAP Należy ręcznie ustawić obszar pamięci SQL Na osobnych maszynach - Transfer danych przez sieć (ale sieci są szybkie ) - Hurtownia obciąża serwer OLTP (ale w nocy ) +Brak rywalizacji o zasoby między SQL i OLAP
Hurtownia i kostki (praktyka) Doświadczenia z instalacji produkcyjnych OLAP bardzo obciąża serwer, zwłaszcza w procesie przetwarzania Dokładnie w tym samym czasie dociążany jest serwer SQL (bardzo złożone zapytania, generujące długie resultsety) Silna rywalizacja o pamięć – często kończy się nadmiernym pagingiem Warto rozważyć jeden wspólny serwer dla OLTP i hurtowni W typowej firmie każda z tych baz jest dociążana w innym okresie (OLTP w ciągu dnia, hurtownia w nocy).
Windows 2003 Server Wstępne wyniki testów (w laboratoriach Comarch-CDN) Wyraźny wzrost wydajności serwera SQL 2000 pracującego na platformie Windows 2003 Server Duży wzrost wydajności aplikacji przetwarzających dane, pracujących na Windows 2003 Server W pewnych scenariuszach obserwujemy wypadkowy wzrost wydajności (serwer SQL + aplikacja) rzędu 200% i więcej Oficjalne dokumenty Microsoft Usprawnione mechanizmy schedulera, podsystemu I/O, adresowania AWE http://www.microsoft.com/sql/techinfo/planning/winsvr2003benefits.asp
Bezpieczeństwo danych Model bezpieczeństwa oparty o Active Directory Koncepcja ról rzutowanych na użytkowników / grupy Role definiowane na poziomie bazy danych Przypisywanie ról do kostek Mechanizmy uprawnień Przypisanie roli do poszczególnych kostek Definiowanie wycinka wymiaru dostępnego dla roli Cell security – dla wymagających Testowanie ról
Pamięć a dimension security W pamięci umieszczane są cieniowe kopie wymiarów Po jednej kopii dla każdej roli zawierającej <dimension security> Kopia zawiera elementy dozwolone oraz ich poprzedników (ancestors) Pojawia się w pamieci w momencie podłączenia się pierwszego użytkownika korzystającego z roli Zostaje w pamięci do momentu procesowania kostki (lub restartu serwera) Scenariusz kostek połączonych (Linked Cubes)
Podsumowanie Dobre przygotowanie aplikacji opartej o Microsoft Analysis Services wymaga Znajomości praw fizyki Np. czym się różni pamięć RAM od dysku Dobrego zaplanowania fundamentów Schemat gwiazdy Schemat nazewnictwa wymiarów Defensywnego podejścia do projektu Więzy integralności Diagnostyka błędów Iteracyjnego rozwoju Monitorowanie Zmiany Testy Monitorowanie …
Na koniec: ciekawostka sp_addlinkedserver @server = ‘LinkedOLAP', @provider = 'MSOLAP‘, @provstr= 'Data Source=MyServer; Initial Catalog=MyOlapDb;', @srvproduct = '' SELECT * FROM OPENQUERY(LinkedOLAP, 'SELECT [Kontrahent.Akwizytor:Akronim], Sum ([Przychód]) FROM [Analiza Sprzedaży] WHERE [Czas.Kalendarzowy:Rok]=2003 GROUP BY [Kontrahent.Akwizytor:Akronim]')
Bibliografia The Data Warehouse Lifecycle Toolkit Ralph Kimball microsoft.public.sqlserver.olap msnews.microsoft.com SQL Server 2000 Resource Kit Rozdział 26 White papers (http://msdn.microsoft.com/) Analysis Services: Optimizing Cube Performance Using Microsoft SQL Server 2000 Analysis Services MSDN