strojenie baz danych: indeksy - Cezary Ołtuszyk
Transkrypt
strojenie baz danych: indeksy - Cezary Ołtuszyk
STROJENIE BAZ DANYCH: INDEKSY Cezary Ołtuszyk coltuszyk.wordpress.com STROJENIE BAZ DANYCH: INDEKSY Plan spotkania I. Wprowadzenie do strojenia baz danych II. Mierzenie wydajności III. Jak SQL Server przechowuje i czyta dane? IV. Budowa i typy indeksów V. Strategie indeksowania VI. Podsumowanie STROJENIE BAZ DANYCH: INDEKSY 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 STROJENIE BAZ DANYCH: INDEKSY 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 STROJENIE BAZ DANYCH: INDEKSY Jak SQL Server przechowuje i czyta dane? Data Pages Page 1 Page 2 Page 3 Page 4 Con ... Funk ... Woods ... ... ... ... ... Russo ... Woods ... Barr ... ... ... ... ... Akers ... Funk ... Smith ... Martin ... ... ... Smith Owen Jones ... ... ... ... ... ... ... Page 5 Page 6 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 STROJENIE BAZ DANYCH: INDEKSY 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 Dobrą praktyką jest nie posiadanie sterty w swojej bazie danych 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. STROJENIE BAZ DANYCH: INDEKSY Budowa i typy indeksów – indeksy grupujące Indeks grupujący jest struktura drzewiasta, dokładniej B-drzewo to a 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. STROJENIE BAZ DANYCH: INDEKSY 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 STROJENIE BAZ DANYCH: INDEKSY 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” STROJENIE BAZ DANYCH: INDEKSY 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 STROJENIE BAZ DANYCH: INDEKSY 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 STROJENIE BAZ DANYCH: INDEKSY 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 !!! STROJENIE BAZ DANYCH: INDEKSY 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 STROJENIE BAZ DANYCH: INDEKSY 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 wybierania pojedynczych wierszy do STROJENIE BAZ DANYCH: INDEKSY 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 STROJENIE BAZ DANYCH: INDEKSY 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