STROJENIE BAZ DANYCH: INDEKSY Cezary Ołtuszyk coltuszyk.wordpress.com
Plan spotkania I. Wprowadzenie do strojenia baz danych II. III. IV. Mierzenie wydajności Jak SQL Server przechowuje i czyta dane? Budowa i typy indeksów V. Strategie indeksowania VI. Podsumowanie
Wprowadzenie do strojenia baz danych Strojenie baz danych jest procesem polegającym na skróceniu czasu odpowiedzi serwera na przesyłane do niego zapytania. Proces ten możemy podzielić na kilka etapów, z czego jednym z nich jest tworzenie indeksów Tuning serwera Rozw. p.wielodostępu Indeksowanie Optymalizacja zapytań Projektowanie baz danych
Mierzenie wydajności Do podstawowych miar związanych z mierzeniem wydajności można zaliczyć: Czas wykonania zapytań SQL Plan wykonania instrukcji Ilość odczytanych danych Czas zajętości procesora Niestety żadna z tych miar nie jest idealna
Jak SQL Server przechowuje i czyta dane? Data Pages Page 1 Page 2 Page 3 Con Funk Russo Woods Akers Funk Woods Barr Smith Martin Page 4 Page 5 Page 6 Smith Owen Jones Martin Pica Jones Smith Ganio Jones Hall Podstawową jednostką zapisu i odczytu w SQL Server jest strona, która zawiera 8KB danych. Jeżeli strony te są odpowiednio poukładane, to serwer może pracować wydajnie
Budowa i typy indeksów sterta (brak indeksu grupującego) Stertę tworzą nieuporządkowane dane tabeli Dane te zapisane są na stronach, które zawierają odnośniki do stron poprzedniej i następnej Wyszukiwanie danych w tego typu strukturze jest bardzo nieefektywne, gdyż aby wybrać pojedynczy wiersz należy przeczytać wszystkie strony tabeli Z uwagi na to, że stertę tworzą fizyczne dane tabeli, to terminów tabela bez indeksu grupującego i sterta możemy używad zamiennie. Dobrą praktyką jest nie posiadanie sterty w swojej bazie danych
Budowa i typy indeksów indeksy grupujące Indeks grupujący jest to struktura drzewiasta, a dokładniej B-drzewo Jej wierzchołkami są strony zawierające klucz indeksu zaś liście to dane tabeli Dzięki takiej budowie dostęp do danych może być bardzo efektywny Na tabeli można założyd tylko jeden indeks typu CLUSTERED, gdy tak się stanie mówimy, że tabela jest indeksem grupującym.
Budowa i typy indeksów indeksy niegrupujące Indeks niegrupujący jest to także B-drzewo, jednakże strony tego indeksu nie są danymi tabeli, lecz ich kopią identycznie jak przy indeksach grupujących wierzchołkami są strony zawierające klucz indeksu liście indeksu niegrupującego nie zawierają danych, znajdują się na nich jedynie wskaźniki do tabeli źródłowej jeżeli indeksowana przez nas tabela jest indeksem typu CLUSTERED, to wskaźnikiem w indeksie niegrupującym jest klucz tego indeksu
Budowa i typy indeksów indeksy niegrupujące z kolumnami zawieranymi Indeks niegrupujący z kolumnami zawieranymi budową przypomina zwykły indeks niegrupujący Jedyną różnicą między nimi są liście, a dokładniej w indeksie z kolumnami zawieranymi posiadają one nie tylko wskaźnik do tabeli źródłowej lecz także kopię źródłowych danych Dzięki tej różnicy używając indeksu z kolumnami zawieranymi jesteśmy w stanie pozbyć się kosztownych operacji typu KEY LOOKUP
Budowa i typy indeksów indeksy filtrowane Indeksy filtrowane są zostały wprowadzone wraz z SQL Server 2008 Jak wskazuje nazwa możemy w nich użyć filtru w celu wybrania dokładnie tych rekordów, które chcemy zindeksować Dzięki temu, że indeks zawiera tylko wybrane rekordy to zajmuje mniej miejsca na dysku i działa szybciej Filtr jest bardzo intuicyjny w obsłudze przez programistów, gdyż jest to zwykła klauzula WHERE
Budowa i typy indeksów widoki indeksowane W SQL Server możemy kłaść indeksy nie tylko na tabelach, także bezpośrednio na widokach. Ponieważ dane dla takiego widoku są bezpośrednio przechowywane na stronach, to widok taki nazywamy widokiem zmaterializowanym Aby zindeksować widok musi on spełnić szereg wymagań, do najważniejszych z nich można zaliczyć używanie w widoku tylko i wyłącznie tabel jako źródeł danych oraz użycie opcji SCHEMABINDING
Budowa i typy indeksów indeksy typu COLUMNSTORE Indeksy typu columnstore mają być nowością wprowadzoną wraz SQL Server Denali (2012) Ich budowa wewnętrzna różni się od budowy indeksów przedstawianych wcześniej Każda strona indeksu columnstore może przechowywać wartości tylko jednej z kolumn Strony indeksu są skompresowane, ale algorytm kompresji jest inny niż algorytm kompresji danych wprowadzony w SQL 2008 Indeks ten ma szereg ograniczeń, a największym z nich jest brak możliwości aktualizacji zindeksowanej tabeli!!!
Budowa i typy indeksów czego nie omówiliśmy i dlaczego tak się stało Indeksy z ograniczeniem UNIQUE Indeksy typu XML Indeksy pełnotekstowe Indeksy typów geograficznych i geometrycznych
Strategie indeksowania Dobrą praktyką jest zakładanie indeksów grupujących na wszystkich tabelach w naszej bazie Rozważmy takie wybieranie kolumn dla klucza indeksu grupującego by pomógł on nam w wybieraniu dużej ilości wierszy Starajmy się aby klucz indeksu grupującego był jak najkrótszy Jeżeli używamy indeksu klastrowego, to jako jego klucza użyjmy kolumny, która nie zmienia wartości Zawsze gdy mamy taką możliwość używajmy indeksów typu UNIQUE Używajmy indeksów niegrupujących do wybierania pojedynczych wierszy
Strategie indeksowania Rozważmy możliwość użycia indeksów niegrupujących do wstępnych agregacji lub pokrycia zapytań Nie przesadzajmy z ilością kolumn w indeksach Jeżeli łączymy dwie tabele, to połóżmy indeksy na kolumnach występujących w klauzuli JOIN Jeżeli chcemy użyć widoku indeksowanego to dobrze przemyślmy sprawę Jeżeli chcemy użyć indeksu typu COLUMNSTORE - tym bardziej przemyślmy sprawę Pamiętajmy, że indeksy mają też złe strony
Podsumowanie Nieposortowane dane tabeli nazywamy stertą Możemy położyć tylko jeden indeks grupujący na naszej tabeli, dobrze jest robić świadomie Dobrym nawykiem jest to, że zawsze kładziemy indeks grupujący Istnieje wiele rodzajów indeksów niegrupujących, każdy z nich jest przeznaczony do innych celów Indeksy możemy kłaść nie tylko na tabelach Dla specyficznych typów danych SQL Server ma zaprojektowane specjalne rodzaje indeksów