Cwiczenie 1. Wys wietlanie plano w wykonania polecen SQL Optymalizacja poleceń SQL 1 W kolejnych sekcjach warsztatu zaprezentowane zostaną różne metody odczytywania planu wykonania polecenia SQL. Metody te różnią się między sobą dostępnością w narzędziach firmy Oracle, a także wiarygodnością uzyskiwanych przy ich zastosowaniu informacji. Uwaga! Przed rozpoczęciem ćwiczenia zapoznaj się z materiałami wprowadzającymi do tematyki optymalizacji procesu wykonania poleceń SQL (prezentacja pt. Optymalizacja poleceń SQL. Wprowadzenie ). Przygotowanie środowiska do ćwiczeń 1. Uruchom narzędzie Oracle SQL Developer i przyłącz się do własnego konta w bazie danych. 2. Utwórz relacje, które będą wykorzystywane podczas ćwiczeń. W tym celu wykonaj poniższe polecenia: CREATE TABLE opt_pracownicy AS SELECT * FROM sbd_tools.opt_pracownicy; CREATE TABLE opt_zespoly AS SELECT * FROM sbd_tools.opt_zespoly; CREATE TABLE opt_etaty AS SELECT * FROM sbd_tools.opt_etaty; Utworzą one w Twoim schemacie trzy relacje: OPT_PRACOWNICY (10 000 rekordów), OPT_ZESPOLY (5 rekordów) oraz OPT_ETATY (12 rekordów), które będą używane podczas warsztatu. 3. Sprawdź, czy wymienione w poprzednim punkcie relacje zostały utworzone. Możesz do tego użyć poniższego zapytania. SELECT table_name FROM user_tables;
Optymalizacja poleceń SQL 2 Polecenie EXPLAIN PLAN 1. Napisz i wykonaj polecenie SQL, które wyświetli nazwiska wszystkich pracowników z relacji OPT_PRACOWNICY wraz z nazwami zespołów z relacji OPT_ZESPOLY, do których pracownicy należą. Polecenie może mieć następującą postać: SELECT nazwisko, nazwa FROM opt_pracownicy JOIN opt_zespoly USING(id_zesp); 2. W kolejnych punktach odczytamy z systemu zarządzania bazą danych (w skrócie SZBD) algorytm, wg którego polecenie SQL ma zostać wykonane, czyli tzw. plan wykonania polecenia. Najpierw zażądamy przygotowania przez SZBD planu wykonania polecenia SQL. Do tego celu służy komenda EXPLAIN PLAN, której podstawową formę przedstawiono poniżej. EXPLAIN PLAN FOR polecenie_sql; EXPLAIN PLAN jest poleceniem SZBD Oracle oznacza to, że będzie działało w każdym narzędziu, które ma możliwość przyłączenia się do SZBD Oracle i przesyłania poleceń. Uwaga! Polecenie EXPLAIN PLAN nie powoduje wykonania polecenia, a jedynie uruchamia proces budowy planu wykonania polecenia. Należy mieć świadomość, że plan wygenerowany przez polecenie EXPLAIN PLAN, może nie być planem, według którego polecenie zostałoby zrealizowane w sytuacji jego wykonania. Przygotujemy teraz plan wykonania naszego polecenia SQL. Wykonaj poniższe polecenie. EXPLAIN PLAN FOR SELECT nazwisko, nazwa FROM opt_pracownicy JOIN opt_zespoly USING(id_zesp); 3. Po pomyślnym wykonaniu polecenia EXPLAIN PLAN zobaczysz komunikat: Plan FOR succeeded. W specjalnej, predefiniowanej relacji o nazwie PLAN_TABLE zostały umieszczone informacje o planie wykonania polecenia SQL wskazanego w poleceniu EXPLAIN PLAN. Aby te informacje odczytać, należy użyć predefiniowanej funkcji tablicowej DISPLAY z pakietu DBMS_XPLAN w sposób przedstawiony poniżej. SELECT * FROM TABLE(dbms_xplan.display());
Optymalizacja poleceń SQL 3 Wynik działania funkcji to raport pokazujący plan wykonania zapytania SQL z ostatniego polecenia EXPLAIN PLAN (poniższy widok w Oracle SQL Developer). Raport składa się z następujących części: Linia 1. wynik działania funkcji haszującej, zastosowanej do tekstu polecenia SQL (wartość wykorzystywana przy identyfikacji identycznych poleceń SQL w sytuacji ponownego wykonania wcześniej zrealizowanego polecenia, SZBD może użyć planu wykonania, przygotowanego dla wcześniejszego wykonania, zamiast tworzenia nowego planu mechanizm o nazwie soft parsing). Linie 3. 10. plan wykonania polecenia SQL. Linie 12. 15. informacje o predykatach, wykonywanych podczas realizacji polecenia SQL (w naszym przykładzie jedyny predykat to warunek połączeniowy). Numer przy predykacie wskazuje numer linii w planie z operacją, w ramach której dany predykat został użyty (linia taka jest dodatkowo wyróżniona gwiazdką patrz linia nr 7). Linie 17. 19. dodatkowe informacje (w naszym przykładzie wskazanie konieczności realizacji tzw. dynamicznego próbkowania statystyk przed zbudowaniem planu wykonania polecenia). 4. Jeśli chcemy znaleźć plany wykonania kilku poleceń SQL, kolejne polecenia można oznaczyć własnymi identyfikatorami. Służy do tego klauzula SET STATEMENT_ID polecenia EXPLAIN PLAN. Znajdźmy ponownie plan wykonania polecenia z połączeniem, tym razem polecenie oznaczymy identyfikatorem zap_1_<numer_indeksu> (zastąp <numer_indeksu> swoim numerem indeksu). EXPLAIN PLAN SET STATEMENT_ID = 'zap_1_12345' FOR SELECT nazwisko, nazwa FROM opt_pracownicy JOIN opt_zespoly USING(id_zesp);
Optymalizacja poleceń SQL 4 Teraz znajdźmy plan wykonania kolejnego polecenia SQL, znajdującego dla każdego etatu w zbiorze pracowników relacji OPT_PRACOWNICY średnią pensję. Zapytanie oznaczymy identyfikatorem zap_2_<numer_indeksu>. EXPLAIN PLAN SET STATEMENT_ID = 'zap_2_12345' FOR SELECT etat, ROUND(AVG(placa),2) FROM opt_pracownicy GROUP BY etat; Aby wyświetlić plan wykonania polecenia o danym identyfikatorze, wywołując funkcję DBMS_XPLAN.DISPLAY podajemy jako wartość parametru STATEMENT_ID identyfikator polecenia. Poniższe polecenie wyświetli plan wykonania drugiego polecenia. SELECT * FROM TABLE(dbms_xplan.display(statement_id => 'zap_2_12345')); 5. Dodatkowy parametr funkcji DBMS_XPLAN.DISPLAY o nazwie FORMAT pozwala na zmianę poziomu szczegółowości informacji w raporcie z planem wykonania. Niektóre z wartości dla tego parametru to: BASIC raport będzie zawierał jedynie plan wykonania polecenia SQL, TYPICAL domyślna wartość parametru, raport będzie zawierał tylko te informacje, które mają istotne znacznie dla wyświetlanego planu wykonania polecenia, ALL raport będzie zawierał wszystkie informacje o planie wykonania. Poniższe polecenie wyświetli tylko plan wykonania (bez żadnych dodatkowych informacji) dla polecenia oznaczonego identyfikatorem zap_2_<numer_indeksu>. SELECT * FROM TABLE(dbms_xplan.display( statement_id => 'zap_2_12345', format => 'BASIC'));
Optymalizacja poleceń SQL 5 Postać raportu przedstawiono poniżej. 6. Oracle SQL Developer udostępnia również narzędzie, które wyświetla plan polecenia SQL w formie grafu. W tym celu po wpisaniu tekstu polecenia należy nacisnąć przycisk Explain Plan..., umieszczony w pasku narzędziowym, lub nacisnąć klawisz F10. Prezentowany raport ma nieco inną formę niż wynik działania polecenia EXPLAIN PLAN i funkcji DBMS_XPLAN.DISPLAY, jednak prezentowane informacje są identyczne.
Optymalizacja poleceń SQL 6 Zadania samodzielne 1. Wyświetl plan wykonania polecenia, oznaczonego identyfikatorem zap_1_<numer_indeksu>, z domyślnym poziomem szczegółowości prezentowanych informacji. 2. Wyświetl ponownie plan dla zapytania zap_1_<numer_indeksu>, tym razem z pełnymi informacjami. 3. Przygotuj i wykonaj zapytanie, które policzy liczbę pracowników dla każdego etatu. Odczytaj plan wykonania tego zapytania posługując się zarówno poleceniem EXPLAIN PLAN, jak również korzystając z narzędzia prezentacji planu w formie grafu.
Optymalizacja poleceń SQL 7 Dyrektywa AUTOTRACE W niektórych narzędziach oferowanych przez firmę Oracle (m.in. Oracle SQL Developer, SQL*Plus, isql*plus, SQLcl), mamy możliwość łatwiejszego wydobywania planu wykonania polecenia SQL niż przy użyciu komendy EXPLAIN PLAN. Narzędzia te można ustawić w tryb pracy z prezentacją planów wykonywanych poleceń. Służy do tego dyrektywa AUTOTRACE. 1. W Oracle SQL Developer, będąc przyłączonym do swojego konta bazodanowego, w edytorze poleceń SQL ponownie wpisz i wykonaj polecenie SQL, które wyświetli średnie pensja dla etatów w zbiorze pracowników relacji OPT_PRACOWNICY. SELECT etat, ROUND(AVG(placa),2) FROM opt_pracownicy GROUP BY etat; 2. W edytorze poleceń SQL wpisz i wykonaj poniższe polecenie: SET AUTOTRACE ON EXPLAIN Polecenie włącza tryb pracy z automatyczną prezentacją planu wykonania polecenia SQL. Następnie w edytorze SQL zaznacz tekst zapytania z punktu 2. i uruchom je jako skrypt (klawisz F5). Wynik powinien prezentować się tak, jak na poniższym rysunku. Otrzymaliśmy: wynik polecenia oraz plan wykonania polecenia.
Optymalizacja poleceń SQL 8 Porównując ten mechanizm z poleceniem EXPLAIN PLAN, należy zauważyć: Cecha EXPLAIN PLAN AUTOTRACE Czy polecenie jest wykonywane? nie tak Czy plan zgodny z rzeczywistym? nie zawsze tak (w Oracle SQL Developer i SQLcl) nie zawsze (SQL*Plus, isql*plus) 3. W edytorze poleceń SQL wpisz i wykonaj poniższe polecenie: SET AUTOTRACE ON STATISTICS Komenda ta włącza tryb pracy z automatyczną prezentacją tzw. statystyk wykonania polecenia SQL. Wykonaj ponownie zapytanie z punktu 1. (jako skrypt klawisz F5). Statystyki wykonania charakteryzują sam proces wykonania polecenia SQL, np. ile danych odczytano z bufora bazy danych, ile operacji sortowania wykonano, itd. Statystykom wykonania przyjrzymy się w dalszej części warsztatów z optymalizacji poleceń SQL.
Optymalizacja poleceń SQL 9 4. Aby narzędzie prezentowało zarówno plan wykonania, jak i statystyki wykonania polecenia SQL, należy posłużyć się trzecią formą dyrektywy AUTOTRACE. Wykonaj w edytorze SQL poniższe polecenie: SET AUTOTRACE ON Następnie ponownie wykonaj polecenie z punktu 2. (jako skrypt klawisz F5). Jako wynik otrzymasz: wynika polecenia SQL, plan wykonania polecenia SQL oraz statystyki wykonania polecenia SQL. 5. Wyłącz tryb pracy z prezentacją planów i statystyk, wykonując poniższe polecenie. SET AUTOTRACE OFF 6. Uwaga! Niektóre narzędzia firmy Oracle, np. SQL*Plus i isql*plus akceptują jeszcze jedną formę dyrektywy AUTOTRACE, mianowicie: SET AUTOTRACE TRACEONLY Ustawia ona tryb pracy, w którym prezentowany jest plan wykonania polecenia oraz statystyki wykonania polecenia, natomiast sam wynik polecenia nie jest prezentowany. Bieżąca wersja Oracle SQL Developer nie wspiera jednak tego trybu pracy. 7. Podobnie jak w przypadku polecenia EXPLAIN PLAN, Oracle SQL Developer udostępnia narzędzie, które wyświetla plan polecenia SQL w formie grafu, przy użyciu mechanizmu AUTOTRACE. W tym celu po wpisaniu tekstu polecenia należy nacisnąć przycisk Autotrace..., umieszczony w pasku narzędziowym, lub nacisnąć klawisz F6. Wyświetlone zostają dwa okna: jedno z planem wykonania, a drugie ze statystykami wykonania polecenia. Prezentowane informacje są identyczne z tymi, które uzyskujemy po użyciu dyrektywy AUTOTRACE ON (patrz poniższy rysunek).
Optymalizacja poleceń SQL 10
Optymalizacja poleceń SQL 11 Funkcja DBMS_XPLAN.DISPLAY_CURSOR Używając do wyświetlania planów wykonania mechanizmów EXPLAIN PLAN oraz AUTOTRACE, nie mamy gwarancji, że zaprezentowany plan jest rzeczywistym planem, jaki byłby wybrany do wykonania polecenia SQL. Jeśli chcemy wyświetlić plan rzeczywisty, musimy samodzielnie sięgnąć do wewnętrznych struktur SZBD. 1. W Oracle SQL Developer przygotuj i wykonaj zapytanie wyświetlające nazwy zespołów wraz z liczbami pracujących w nich pracowników. Zapytanie może wyglądać jak przedstawiono poniżej. SELECT nazwa, COUNT(*) FROM opt_pracownicy JOIN opt_zespoly USING(id_zesp) GROUP BY nazwa ORDER BY nazwa; 2. Użyjemy teraz predefiniowanej funkcji DISPLAY_CURSOR z pakietu DBMS_XPLAN. Powoduje ona wyświetlenie rzeczywistego planu wykonania zrealizowanego wcześniej polecenia SQL. Uwaga! Poznana wcześniej funkcja DBMS_XPLAN.DISPLAY jedynie odczytuje z relacji PLAN_TABLE informacje o planie zbudowanym w reakcji na żądanie użytkownika (poleceniem EXPLAIN PLAN) plan ten de facto nie został użyty do wykonania polecenia. Funkcja DBMS_XPLAN.DISPLAY_CURSOR odczytuje z wewnętrznych struktur SZBD informacje o planie, który rzeczywiście został wybrany do realizacji wykonanego polecenia SQL. 3. Wykonaj poniższe polecenie. SELECT * FROM TABLE(dbms_xplan.display_cursor()); Wywołanie funkcji DBMS_XPLAN.DISPLAY_CURSOR bez parametrów odczytuje z wewnętrznych struktur SZBD informacje o planie wykonania, jaki został użyty do realizacji ostatnio wykonywanego w sesji polecenia SQL. Otrzymany wynik przedstawia poniższy rysunek.
Optymalizacja poleceń SQL 12 Jak widzimy, prezentowane informacje to plan wykonania polecenia SQL. Znaczenia poszczególnych elementów raportu są identyczne jak te, które zostały omówione w części warsztatu, dotyczącej polecenia EXPLAIN PLAN. 4. Używając funkcji DBMS_XPLAN.DISPLAY_CURSOR, możemy również odczytać plan wykonania innego polecenia niż ostatnio wykonywane w sesji. W tym celu jako parametr funkcji należy podać identyfikator polecenia. Identyfikator polecenia jest nadawany przez SZBD automatycznie i należy go szukać w perspektywie systemowej V$SQL w kolumnie SQL_ID filtrując dane tej perspektywy wg tekstu poszukiwanego polecenia w kolumnie SQL_TEXT. Poniższe polecenie znajdzie rekord w perspektywie V$SQL opisujący zapytanie z punktu 1. SELECT sql_text, sql_id, to_char(last_active_time, 'yyyy.mm.dd hh24:mi:ss') as last_active_time, parsing_schema_name FROM v$sql WHERE sql_text LIKE 'SELECT nazwa%opt_pracownicy JOIN opt_zespoly%order BY nazwa'; Uwaga! Powyższe zapytanie może zwrócić informacje o identycznym zapytaniu, ale wykonanym przez innych użytkowników bazy danych. Znajdź w wyniku zapytania ten wiersz, który odnosi się do Twojego schematu ma w kolumnie PARSING_SCHEMA_NAME ciąg znaków równy nazwie Twojego schematu.
Optymalizacja poleceń SQL 13 Otrzymany identyfikator polecenia (wartość w kolumnie SQL_ID) przekazujemy jako parametr funkcji DBMS_XPLAN.DISPLAY_CURSOR o nazwie SQL_ID: SELECT * FROM TABLE(dbms_xplan.display_cursor(sql_id => 'buz2ccxnxsgwf')); Powinniśmy otrzymać raport identyczny z tym z punktu 3. 5. Można ułatwić sobie wyszukiwanie identyfikatorów poleceń w V$SQL, umieszczając w tekście polecenia (np. po klauzuli SELECT) komentarz z numerem Twojego indeksu. Np. po wykonaniu polecenia: SELECT /* MOJE_ZAPYTANIE_12345*/ nazwa, count(*) FROM opt_pracownicy JOIN opt_zespoly USING(id_zesp) GROUP BY nazwa ORDER BY nazwa; odszukanie jego identyfikatora sprowadza się do wykonania poniższego zapytania. SELECT sql_id FROM v$sql WHERE sql_text LIKE 'SELECT /* MOJE_ZAPYTANIE_12345*/%';