Zapytania SQL: wydajność i optymalizacja Łukasz Twardokęs, SDM-2 2008
Plan prezentacji Jak pisać wydajne zapytania SQL ? Wydajność poleceń SQL, a fizyczny projekt bazy danych, czyli o… indeksach, partycjach i widokach zmaterializowanych Jak Oracle, DB2 oraz SQL Server automatycznie optymalizują zapytania i dostęp do danych Klika słów o pracy magisterskiej
Wydajność systemu Oracle Na podstawie: C. Millsap J. Holt Optimizing Oracle Performance
Metody dostępu do tabel pełny przegląd tabeli dostęp przez ROWID
Współdzielenie zapytań SQL Warunki korzystania z współdzielonego zapytania: dokładna (co do znaku) zgodność treści pomiędzy zapytaniem zadanym oraz przechowywanym w obszarze współdzielonym SELECT * FROM EMP ≠ SELECT * From EMP obiekty, do których odnosi się zapytanie muszą być dokładnie tymi samymi obiektami co w zapytaniu współdzielonym nazwy zmiennych związanych muszą być identyczne SELECT * FROM EMP WHERE id = :manager_id ≠ SELECT * FROM EMP WHERE id = :worker_id
Zapytania – dobre praktyki (1) Należy unikać * w klauzuli SELECT Wykorzystywanie klauzuli WHERE zamiast HAVING SELECT r.nazwa, COUNT(*) as ilosc FROM region r, sklep s WHERE r.region_id = s.region_id GROUP BY r.nazwa HAVING r.nazwa != ‘mazowieckie’ AND r.nazwa != ‘śląskie’ AND ilosc < 5 SELECT r.nazwa, COUNT(*) as ilosc FROM region r, sklep s WHERE r.region_id = s.region_id AND r.nazwa != ‘mazowieckie’ AND r.nazwa != ‘śląskie’ GROUP BY r.nazwa HAVING ilosc < 5
Zapytania – dobre praktyki (2) należy unikać zbędnych klauzul DISTINCT gdy zastosowanie klauzuli DISTINCT jest konieczne, należy zastanowić się czy nie można jej tak przekształcić aby zastosować operator EXISTS SELECT DISTINCT p.nazwa FROM produkt p, sprzedaz s WHERE p.produkt_id = s.produkt_id SELECT p.nazwa FROM produkt p WHERE EXISTS ( SELECT 1 FROM sprzedaz s WHERE p.produkt_id = s.produkt_id )
Zapytania – dobre praktyki (3) UNION ALL zamiast UNION (SELECT s.nazwa, s.miasto, s.ulica FROM sklep s, region r WHERE s.region_id = r.region_id AND r.kod = ‘SL’ ) UNION AND s.kod = ‘MZ’ ) (SELECT s.nazwa, s.miasto, s.ulica FROM sklep s, region r WHERE s.region_id = r.region_id AND r.kod = ‘SL’ ) UNION ALL AND s.kod = ‘MZ’ )
Zapytania – dobre praktyki (4) NOT EXIST zamiast NOT IN SELECT s.numer, s.nazwa FROM sklep s WHERE s.region_id NOT IN (SELECT r.region_id FROM region r WHERE r.kod IN (‘SL’, ‘MZ’) ) SELECT s.numer, s.nazwa, FROM sklep s WHERE NOT EXISTS (SELECT 1 FROM region r WHERE IN (‘SL’, ‘MZ’) )
Zapytania – wykorzystanie indeksów (1) obliczenia na indeksowanej kolumnie blokują korzystanie z indeksu konkatenacja indeksowanych kolumn SELECT p.nazwa, p.cena FROM produkt p WHERE ps.cena * 0,2 > 100 SELECT p.nazwa, p.cena FROM produkt p WHERE ps.cena > 500 SELECT s.nazwa FROM sklep s, region r WHERE s.region_id = r.region_id AND r.nazwa || ‘-’ ||s.miasto = ‘mazowieckie-Warszawa’ SELECT s.nazwa FROM sklep s, region r WHERE s.region_id = r.region_id AND r.nazwa = ‘mazowieckie’ AND s.miasto = ‘Warszawa’
Zapytania – wykorzystanie indeksów (2) zastosowanie funkcji na indeksowanej kolumnie niejawna konwersja typów SELECT … FROM sklep s WHERE UPPER(s.nazwa) = ‘SUPERSAM’ SELECT … FROM sklep s WHERE s.nazwa = ‘SUPERSAM’ SELECT s.nazwa, s.miasto FROM sklep s WHERE s.numer = 1234 SELECT s.nazwa, s.miasto FROM sklep s WHERE s.numer = ‘1234’ SELECT s.nazwa, s.miasto FROM sklep s WHERE TO_NUMBER(s.numer) = 1234
Zapytania – wykorzystanie indeksów (3) wykorzystanie w warunku porównania operatorów: NOT, !=, <> blokuje korzystanie z indeksu Efektywniej na indeksowanej kolumnie wykonywane jest porównanie >=, niż > Zastosowanie wzorca w klauzuli LIKE, zawierającego na początku znak specjalny % lub _ blokuje wykorzystanie indeksu SELECT p.nazwa, p.cena FROM produkt p WHERE p.nazwa LIKE ‘%orzechy%’
Struktury fizyczne poprawiające wydajność Indeksy B-drzewa Bitmapowe … Partycje Range List Hash Widoki zmaterializowane Jednopoziomowe partycjonowanie Partycjonowanie złożone
Automatyczne strojenie zapytań Oracle – SQL Tuning Advisor oraz SQL Access Advisor DB2 – DB2 Design Advisor SQL Server – Database Tuning Advisor
Przykład interfejsu – Oracle (1) Rysunek 1. Uruchomienie SQL Tuning Advisor
Przykład interfejsu – Oracle (2) Rysunek 2. Wynik działania SQL Tuning Advisor
Przykład interfejsu – Oracle (3) Rysunek 3. Nowy plan zapytania po implementacji wskazówki SAL Tuning Advisor
Kilka słów o pracy magisterskiej Temat : „Badanie wydajności zapytań na przykładzie trzech komercyjnych baz danych Oracle, DB2 oarz SQL Server” Promotor: dr inż. Michał Rudowski
Literatura C. Millsap, J. Holt: Optimizing Oracle performance, O’Reilly, 2003 B. Dageville, D. Das, K. Dias, K.Yagoube, M. Zait, M. Ziauddin: Automatic SQL Tuning in Oracle 10g, P. S. Sadore: How to write efficient SQK Queries with Tims & Tricks
Pytania