Systemy zarządzania bazami danych 15. Strojenie indeksów Indeks • Indeks to struktura danych zapewniająca szybki dostęp do danych klucz wyszukiwania Warunek na wartości atrybutu indeks Oryginał: Shasha & Bonnet Zbiór rekordów 15. Strojenie indeksów Pasujące rekordy 2 Zagadnienia wydajnościowe • • • • • • Rodzaj zapytania Struktura danych indeksu Organizacja danych na dysku Narzuty powodowane przez indeks Rozproszenie danych Pokrycie (strategia tylko-indeks) Oryginał: Shasha & Bonnet 15. Strojenie indeksów 3 Klasyfikacja zapytań 1. Zapytanie punktowe 3. SELECT balance FROM accounts WHERE number = 1023; 2. Zapytanie wielopunktowe SELECT balance FROM accounts WHERE branchnum = 100; Oryginał: Shasha & Bonnet Zapytanie zakresowe SELECT number FROM accounts WHERE balance > 10000; 4. Zapytanie przedrostkowe SELECT * FROM employees WHERE name = ‘Jensen’ and firstname = ‘Carl’ and age < 30; 15. Strojenie indeksów 4 Klasyfikacja zapytań c.d. 5. Zapytanie ekstremalne SELECT * FROM accounts WHERE balance = (select max(balance) from accounts) 6. Zapytanie sortujące SELECT * FROM accounts ORDER BY balance; Oryginał: Shasha & Bonnet 7. Zapytanie grupujące SELECT branchnum, avg(balance) FROM accounts GROUP BY branchnum; 8. Złączenie SELECT distinct branch.adresse FROM accounts, branch WHERE accounts.branchnum = branch.number and accounts.balance > 10000; 15. Strojenie indeksów 5 Klucze wyszukiwania • Klucz (wyszukiwania) to ciąg atrybutów create index i1 on accounts(branchnum, balance); • Rodzaje indeksów – Sekwencyjny: wartości klucza są monotoniczne względem kolejności wstawiania (np. licznik lub stempel czasowy) – Niesekwencyjne: wartości klucza nie mają związku z kolejnością wstawiania (np. NIP, bo PESEL już mniej) Oryginał: Shasha & Bonnet 15. Strojenie indeksów 6 Struktury danych • Większość indeksowych struktur danych to drzewa • Zwykle, korzeń takiego drzewa jest zawsze w pamięci RAM, podczas gdy liście znajdują się na dysku – Wydajność struktury danych zależy od średniej długości ścieżki od liścia do korzenia – Struktury danych o dużym rozgałęzieniu są więc preferowane Oryginał: Shasha & Bonnet 15. Strojenie indeksów 7 B+ drzewo • B+ drzewo to drzewo zrównoważone, którego liście zawierają ciągi par kluczwskaźnik 96 75 83 33 48 69 75 80 81 Oryginał: Shasha & Bonnet 107 83 92 95 96 98 103 15. Strojenie indeksów 107 110 120 8 Wydajność B+ drzew • Liczba poziomów drzewa – Rozgałęzienie drzewa • Wielkość klucza • Wykorzystanie stron • Pielęgnacja drzewa – Na bieżąco • Przy wstawieniach • Przy usunięciach – Manualna • Zamki na węzłach drzewa • Korzeń drzewa w pamięci Oryginał: Shasha & Bonnet 15. Strojenie indeksów 9 Rozmiar klucza • Rozmiar klucza wpływa na rozgałęzienie • Tworząc indeks lepiej wybrać mniejszy klucz • Kompresja klucza – Kompresja przedrostkowa (Oracle 8, MySQL): przechowuj tylko tę część klucza odróżniającą go od sąsiadów: Smi, Smo, Smy zamiast Smith, Smoot, Smythe – Kompresja wspólnego przedrostka (Oracle 5): podobny przedrostek sąsiednich kluczy jest wydzielony, np. Smi, (2)o, (2)y. Są pewne wady: • Procesor obciążony pielęgnacją tej struktury • Zamek na Smoot wymaga też zamka na Smith Oryginał: Shasha & Bonnet 15. Strojenie indeksów 10 Zamki na B+ drzewie • Przeszukiwanie drzewa – Modyfikacja, odczyt – Wstawieniem usunięcie • Problem fantomów: potrzebne są zamki zakresowe • ARIES KVL (zaimplementowane w DB2) • • • • Przejście po drzewie Zamki na krotkach Zamki na kluczach Zamki na zakresach Oryginał: Shasha & Bonnet 15. Strojenie indeksów 2 4 4 11 Zamki na B+ drzewach A zamek T1 B zamek T1 C zamek T1 D E Oryginał: Shasha & Bonnet F 15. Strojenie indeksów 12 Indeks haszowany • Indeks haszowany przechowuje pary kluczwartość korzystąc z pseudo-ranomizującej funkcji zwanej funkcją haszującą Zhaszowany Wartości klucz klucz 2341 Funkcja haszująca 0 1 R1 R5 R3 R6 R9 n Oryginał: Shasha & Bonnet 15. Strojenie indeksów R14 R17 R21 R25 Długość tych łańcuchów wpływa na wydajność 13 Pogrupowany i niepogrupowany • Indeks pogrupowany (indeks główny) • Indeks niepogrupowany (indeks drugorzędny) – Atrybuty o bliskich wartości klucza są sobie bliskie fizycznie na dysku – Tabela może mieć tylko jeden taki indeks Rekordy Oryginał: Shasha & Bonnet – Indeks niepogrupowany nie ogranicza fizycznej organizacji tabeli – Tabela może mieć wiele takich indeksów Rekordy 15. Strojenie indeksów 14 Gęsty i rzadki • Indeks rzadki • Indeks gęsty – Wskaźniki wskazują strony – Indeksy pogrupowane mogą być rzadkie S1 S2 Oryginał: Shasha & Bonnet – Wskaźniki wskazują rekordy – Indeksy niepogrupowane muszą być gęste rekord Si rekord 15. Strojenie indeksów rekord 15 Więzy a indeksy • Klucz główny, klucz alternatywny – Unikatowy indeks niepogrupowany jest tworzony na atrybutach składających się na klucz • Klucz obcy – Domyślnie nie tworzy się indeksu wymuszającego więzy klucza obcego Oryginał: Shasha & Bonnet 15. Strojenie indeksów 16 Implementacja indeksów w SZBD • Oracle • SQL Server – B+drzewo – Indeksy pogrupowane są rzadkie – Pielęgnacja indeksu przy modyfikacjach, wstawieniach, usnięciach – B+drzewo, haszowe, bitmapowe, R-drzewa – Brak indeksu pogrupowanego • Tabela organizowana indeksem (unikatowym/pogrupowanym) • Klastry (grona) tworzone razem z tabelami • DB2 – B+drzewo, rozszerzenie przestrzenne: R-drzewo – Indeksy pogrupowane są gęste – Jawne polecenie reorganizacji indeksu Oryginał: Shasha & Bonnet • MySQL – B+drzewo, R-drzewo – Pielęgnacja indeksu przy modyfikacjach, wstawieniach, usnięciach 15. Strojenie indeksów 17 Regulatory indeksu • • • • • Struktura danych Klucz wyszukiwania Rozmiar klucza Pogrupowany/Niepogrupowany/Bez indeksu Pokrycie (strategia „tylko-indeks”) Oryginał: Shasha & Bonnet 15. Strojenie indeksów 18 Indeks pogrupowany – korzyści • Indeks rzadki (więc pogrupowany) przechowuje mniej wskaźników niż indeks gesty • Może to oszczędzić nam jednego poziomu B+drzewa • Indeks pogrupowany jest dobry do zapytań wielopunktowych (zwłaszcza mało selektywnych) • Białe strony strony książki telefonicznej • Indeks pogrupowany na B+drzewie dobrze wspomaga zapytania zakresowe, przedrostkowe, ekstremalne i sortujące Oryginał: Shasha & Bonnet 15. Strojenie indeksów 19 Indeks pogrupowany – korzyści, c.d. • Indeks pogrupowany (na atrybucie X) może zmniejszyć rywalizację o zamki • Pobranie lub modyfikacja z użyciem warunku równościowego, zakresowego lub przedrostkowego wymaga dostępu do i zamków tylko na kilku sąsiednich fizycznie stronach Oryginał: Shasha & Bonnet 15. Strojenie indeksów 20 Indeks pogrupowany – koszty • Strony nadmiarowe • Wynik wstawień • Wynik modyfikacji powiększających rekordy (np., NULL zastąpiony długim napisem) Oryginał: Shasha & Bonnet 15. Strojenie indeksów 21 Indeks pogrupowany – jedyność • Na tabeli może być tylko jeden indeks pogrupowany • Powielenie tabeli może być dobrym pomysłem, jeśli jego celem jest użycie dwóch różnych indeksów pogrupowanych na tej tabeli • Takim powieleniem są żółte strony książki telefonicznej • Powielenie będzie miało sens tylko jeśli na danej tabeli liczba wstawień i modyfikacji jest niska Oryginał: Shasha & Bonnet 15. Strojenie indeksów 22 Strojenie indeksów – środowisko employees(ssnum, name, lat, long, hundreds1, hundreds2); clustered index c on employees(hundreds1) with fillfactor=100; nonclustered index nc on employees (hundreds2); nonclustered index nc3 on employees (ssnum, name, lat); nonclustered index nc4 on employees (lat, ssnum, name); • 1000000 wierszy; Pusty (zimny) bufor • Dual Xeon (550MHz,512Kb), 1Gb RAM, sterownik RAID Adaptec (80Mb), dyski 4x18Gb (10000RPM), Windows 2000. Oryginał: Shasha & Bonnet 15. Strojenie indeksów 23 Strojenie indeksów – operacje • Modyfikacja update employees set name = ‘XXX’ where ssnum=?; • Wstawienie insert into employees values (1003505,'polo94064',97.48,84.03,4700.55,3987.2); • Zapytanie wielopunktowe: select * from employees where name = ?; select * from employees where hundreds1= ?; select * from employees where hundreds2= ?; • Zapytanie pokryte select ssnum, name, lat from employees; • Zapytanie zakresowe select * from employees where long between ? and ?; • Zapytanie punktowe select * from employees where ssnum = ? Oryginał: Shasha & Bonnet 15. Strojenie indeksów 24 Indeks pogrupowany – pomiary clustered nonclustered no index Throughput ratio 1 0.8 0.6 0.4 0.2 0 SQLServer Oracle Oryginał: Shasha & Bonnet DB2 • Zapytanie wielopunktowe zwracające 100 rekordów spośród 1000000. • Pusty bufor • Odczyt z indeksu pogrupowanego jest co najmniej dwa razy szybszy niż z niepogrupowanego i o rzędy wielkości szybszy niż przegląd pełny 15. Strojenie indeksów 25 Indeks niepogrupowany – korzyści • Indeks gęsty może wyeliminować konieczność odczytu tabeli dzięki pokryciu („tylko-indeks”) • Może być warto stworzyć więcej indeksów po to, aby dać optymalizatorowi więcej możliwości użycia strategii „tylko-indeks” • Indeks niepogrupowany jest dobry, gdy używające go zapytania zwracają znacznie mniej rekordów niż jest stron w tabeli • Zapytania punktowe • Zapytania wielopunktowe, pod warunkiem, że liczba różnych wartości klucza wyszukiwania > liczba stron prefetch * liczba rekordów na stronie Oryginał: Shasha & Bonnet 15. Strojenie indeksów 26 Throughput (queries/sec) Odczyt pełny może być lepszy scan non clustering 0 5 10 15 % of selected records Oryginał: Shasha & Bonnet 20 25 • IBM DB2 v7.1, Windows 2000 • Zapytanie zakresowe • Gdy zapytanie zwraca co najmniej 10% rekordów, odczyt pełny jest często lepszy niż użycie indeksu niepogrupowanego (niepokrywającego) • Punkt przecięcia > 10%, gdy rekordy są duże lub tabela jest pofragmentowana na dysku (wtedy odczyt pełny drożeje) 15. Strojenie indeksów 27 Indeks pokrywający SELECT name FROM employee WHERE department = “marketing” • Dobry indeks pokrywający to (department, name) • Indeks (name, department) mniej użyteczny • Indeks na samym (department) umiarkowanie użyteczny Oryginał: Shasha & Bonnet 15. Strojenie indeksów 28 Throughput (queries/sec) Indeks pokrywający – pomiary 70 60 covering 50 covering - not ordered non clustering 40 30 20 clustering 10 0 • Indeks pokrywający działa szybciej niż pogrupowany, gdy jego pierwsze atrybuty są użyte w klauzuli WHERE, a ostatnie w SELECT • Gdy atrybuty są w indeksie w złym porządku, wydajność znacznie spada SQLServer Oryginał: Shasha & Bonnet 15. Strojenie indeksów 29 Pielęgnacja indeksu – SQL Server Throughput (queries/sec) SQLServer No maintenance Maintenance 0 20 40 60 % Increase in Table Size Oryginał: Shasha & Bonnet 80 100 • Indeks stworzony z parametrem fillfactor = 100. • Wstawienia powodują podział stron i dodatkowe operacje I/O przy każdym zapytaniu • Pielęgnacja polega na stworzeniu indeksu na nowo • Z pielęgnacją wydajność jest stała, a bez niej spada bardzo wyraźnie 15. Strojenie indeksów 30 Pielęgnacja indeksu – DB2 DB2 Throughput (queries/sec) 50 40 30 20 No maintenance Maintenance 10 0 0 20 40 60 % Increase in Table Size Oryginał: Shasha & Bonnet 80 100 • Indeks utworzony z parametrem pctfree = 0 • Wstawienia powodują dodawanie rekordów na końcu tabeli • Każde zapytanie przechodzi przez indeks i czyta ogon tabeli • Wydajność powoli spada, gdy nie ma pielęgnacji 15. Strojenie indeksów 31 Pielęgnacja indeksu – Oracle Throughput (queries/sec) Oracle No maintenance 0 20 40 60 80 % Increase in Table Size Oryginał: Shasha & Bonnet 100 • W Oracle, indeks pogrupowany można symulować poprzez indeks na tabeli w klastrze • Brak automatycznej fizycznej reorganizacji • Indeks utworzony z parametrem pctfree = 0 • Strony nadmiarowe powodują wyraźny spadek wydajności 15. Strojenie indeksów 32 Indeks na małej tabeli • Podręczniki strojenia zalecają, by na małych tabelach unikać indeksów – Jeśli wszystkie dane z relacji mieszczą się na jednej stronie, wszelkie dodatkowe struktury (np. indeksy) powodują dodatkowe operacje I/O – Jeśli każdy rekord mieści się na stronie, indeks jednak poprawia wydajność Oryginał: Shasha & Bonnet 15. Strojenie indeksów 33 Throughput (updates/sec) Indeks na małej tabeli – pomiary 18 16 14 12 10 8 6 4 2 0 no index Oryginał: Shasha & Bonnet index • Mała tabela: 100 rekordów • Dwa współbieżne procesy modyfikują dane (każdy działa 10ms zanim zatwierdzi) • Bez indeksu: każda modyfikacja wymaga odczytu pełnego. Brak współbieżnych modyfikacji • Indeks pogrupowany pozwala na skorzystanie z zamków na poziomie wierszy 15. Strojenie indeksów 34 B+drzewo, hasz, bitmapa – dane employees(ssnum, name, lat, long, hundreds1, hundreds2); create cluster c_hundreds (hundreds2 number(8)) PCTFREE 0; create cluster c_ssnum(ssnum integer) PCTFREE 0 size 60; create cluster c_hundreds(hundreds2 number(8)) PCTFREE 0 HASHKEYS 1000 size 600; create cluster c_ssnum(ssnum integer) PCTFREE 0 HASHKEYS 1000000 SIZE 60; create bitmap index b on employees (hundreds2); create bitmap index b2 on employees (ssnum); • 1000000 wierszy; Pusty (zimny) bufor • Dual Xeon (550MHz,512Kb), 1Gb RAM, sterownik RAID Adaptec (80Mb), dyski 4x18Gb (10000RPM), Windows 2000. Oryginał: Shasha & Bonnet 15. Strojenie indeksów 35 Zapytania wielopunktowe: B+drzewo, hasz, bitmapa Throughput (queries/sec) Multipoint Queries 25 20 15 10 5 0 B-Tree Hash index Oryginał: Shasha & Bonnet Bitmap index • W indeksie haszowanym są łańcuchy stron nadmiarowych • W pogrupowanym B+drzewie rekordy są na kolejnych stronach (ciągła alokacja) • Indeks bitmapowy jest proporcjonalny względem rozmiaru tabeli i odczytuje rekordy w sposób „niepogrupowany” 15. Strojenie indeksów 36 B+drzewo, hasz, bitmapa Throughput (queries/sec) Range Queries • Indeks haszowany nie pomaga w zapytaniach zakresowych 0.5 0.4 0.3 0.2 0.1 0 B-Tree Hash index Bitmap index Throughput(queries/sec) Point Queries • Indeks haszowany pokonuje B+drzewo przy zapytaniach punktowych 60 50 40 30 20 10 0 B-Tree Oryginał: Shasha & Bonnet hash index 15. Strojenie indeksów 37 Kompresja kluczy • Używaj kompresji kluczy, gdy – Używasz B+drzewa – Kompresja kluczy zmniejszy liczbę poziomów B+drzewa – System nie ma dociążonego procesora (tzn. nie procesor jest najbardziej obciążonym zasobem) – Modyfikacje danych są stosunkowo rzadkie Oryginał: Shasha & Bonnet 15. Strojenie indeksów 38 Podsumowanie 1. Indeks haszowany nadaje się tylko do zapytań punktowych. Dla zapytań wielopunktowych i zakresowych lepsze są B+drzewa. 2. Indeks pogrupowany ma być, gdy: • • Zapytania odwołują się do większość pól każdego zwróconego rekordu Dużo jest zapytań zakresowych i wielopunktowych 3. Pokryj kluczowe zapytania indeksem gęstym 4. Nie zakładaj indeksu, gdy dodatkowy czas potrzebny na obsługę wstawień i modyfikacji jest większy niż oszczędności przy zapytaniach Oryginał: Shasha & Bonnet 15. Strojenie indeksów 39 Kreator indeksów MS SQL • MS SQL Server od 7 • Dane wejściowe – Baza danych (schemat + dane + istniejące indeksy) – Reprezentatywny fragment śladu obciążenia • Dane wyjściowe – Ocena istniejących indeksów – Zalecenia dodania lub usunięcia indeksów Oryginał: Shasha & Bonnet • Czynności – Wyliczenie możliwych indeksów na jednym atrybucie i na wielu atrybutach – Przejście tej przestrzeni wyszukiwania wraz z optymalizatorem, aby każdemu indeksowi przypisać koszt 15. Strojenie indeksów 40