Temat : SBQL1 i optymalizacja zapytań. - Dydaktyka
Transkrypt
Temat : SBQL1 i optymalizacja zapytań. - Dydaktyka
Laboratorium Języki i środowiska przetwarzania danych rozproszonych Temat : SBQL1 i optymalizacja zapytań. Historia zmian Data 10.4.2014 Wersja 1.0 Autor Tomasz Kowalski 1 Stack-Based Query Language Opis zmian Utworzenie dokumentu, wprowadzenie treści. 1. Cel laboratorium Głównym celem laboratoriów jest zapoznanie się z metodami optymalizacji zapytań opracowanych dla obiektowego języka zapytań SBQL (Stack-based Query Language) wywodzącego się z podejścia stosowego (SBA 2) do języków zapytań i baz danych autorstwa prof. Kazimierza Subiety z PJWSTK3. 2. Zasoby 2.1. Wymagane oprogramowanie Polecenia laboratorium będą dotyczyły podstaw programowania przy użyciu platformy ODRA. Wersję ODRA przygotowana na potrzeby laboratoriów należy wyeksportować z repozytorium svn: http://team.kis.p.lodz.pl:8080/svn/samples/trunk/odra2 Do uruchomienia systemu ODRA potrzebne będzie środowisko uruchomieniowe JRE (Java Runtime Environment). 2.2. Materiały pomocnicze Materiały dostępne w Internecie: http://www.sbql.pl/SBA_SBQL_description.html http://www.sbql.pl/various/ODRA/ODRA_manual_SBQL_queries.html http://www.sbql.pl/various/ODRA/ODRA_manual_Indexing.html 3. Przygotowanie i uruchomienie ODRA: 1. Do nowego folderu wyeksportuj z repozytorium svn platformę ODRA. 2. Zapoznaj się ze strukturą plików pobranej wersji ODRA. 3. Uruchom edytor notepad++. Zaimportuj styl języka platformy ODRA z pliku notepadsbqlcli.xml. (Widok->Definiowanie własnego stylu->Import). Zrestartuj edytor. 4. Użyj skryptu easystart.bat w celu utworzenia bazy, uruchomienia serwera ODRA oraz interfejsu poleceń CLI (Command Line Interface). 3.1. Przydatne polecenia ODRA: • • • • • help - lista poleceń CLI ODRA show optimization – wyświetla łańcuch zastosowanych optymalizacji set output default | xml – przełącza format wyświetlania rezultatów zapytań set test off | plain | compare – przełącza tryb testowania wydajności zapytań benchmark – specjalny tryb testowania wydajności zapytań 4. Laboratorium: 1. Uruchom skrypt ODRA znajdujący się w pliku res/sampledata/batch/M1dataTK.cli tworzący bazę danych o schemacie przedstawionym na ilustracji 1 poleceniem: batch res/sampledata/batch/m1/M1data.TK.cli 2. Wywołaj procedurę init z parametrem 1000 w celu utworzenia 1000-elementowej kolekcji obiektów Person typu PersonClass (init(1000)). 2 Stack-based Architecture 3 Polsko-Japońska Wyższa Szkoła Technik Komputerowych Student : StudentClass scholarship : Integer getFullName() : String getScholarship() : Integer setScholarship(wartość : Integer) Person : PersonClass name : String surname : String age : Integer married : Boolean getFullName() : String 1 EmpStudent : EmpStudentClass getFullName() : String getTotalIncomes() : Integer Emp : EmpClass salary : Integer getFullName() : String getTotalIncomes() : Integer worksIn employs 0..* 1 Dept : DeptType name : String 1 address address AddressType 1 city : String street : String 1 zip : Integer[0..1] Ilustracja 1: Przykładowy schemat obiektowej bazy danych 3. Napisz zapytanie pokazujące rozmiary kolekcji Person, Emp, Student i EmpStudent w binderach odpowiadających nazwom tych kolekcji (użyj operatora as lub groupas oraz przecinka). 4. Przetestuj różne tryby wyświetlania rezultatu (polecenia set output default, set output xml). 5. Wyświetl informacje o dowolnym pracowniku (o dowolnym indeksie idx, gdzie idx ≥ 1 i idx ≤ count(Emp)) w bazie: Emp[idx]. 6. Włącz tryb mierzenia czasu (polecenie set test plain) i wykonaj następujące zapytania: Q1. (Emp where age = 33). (getFullName() as pnazwa, salary as pensja) Q2. count(Person where surname = "NOWAK" and age > 33) Q3. (Emp where (salary in (Emp where age = 33).salary)).getFullName() Q4. Q5. Dept as d.(d.name, count(Emp where salary = max(d.employs.Emp.salary))) Emp where count(Emp as e where e.salary = salary) = 1 *Jeżeli zapytania Q1 i Q3 zwróciły pusty rezultat zamień 33 na wiek pracownika Emp[idx]. 7. Własnymi słowami wyjaśnij semantykę tych zapytań. 8. Włączając tryb mierzenia czasu (polecenie set test plain). Zmierz i zanotuj czasy wykonania zapytań Q1-Q5. 9. *Na podstawie czasów i postaci zapytań oszacuj ich złożoność obliczeniową. Weź pod uwagę, że nie są one poddane żadnej optymalizacji. 3.1. Optymalizacja zapytań przez indeksowanie 1. Wykonaj następujące polecenie w celu utworzenia pomocniczego indeksu na kolekcji Emp wg klucza age: add index idxEmpAge on Emp(age) 2. Dodaj optymalizacje przez wykorzystanie indeksów do łańcucha optymalizacyjnego ODRA: set optimization index 3. Uruchom ponownie zapytania. Uzasadnij ewentualne zmiany czasu ich wykonania. 4. Włącz tryb porównywania realizacji zapytania z i bez optymalizacji: set test compare 5. Zapoznaj się z wynikami porównania dla zapytań wykorzystujących indeks. W jaki sposób indeks został wykorzystany w ewaluacji zapytań? 6. *Oszacuj złożoność obliczeniową zoptymalizowanych zapytań. 3.2. Wyciąganie niezależnych podzapytań 1. Usuń indeks założony w poprzednim punkcie: remove index idxEmpAge 2. Rozbij zapytanie Q3 na dwa osobne zapytania, tak aby zminimalizować łączny czas wykonania. (Wynik pierwszego zapytania możesz użyć w drugim zapytaniu używając operatora tworzenia kolekcji bag albo union). Porównaj czas z oryginalnym Q3. 3. Opracuj zoptymalizowane zapytanie Q3 (bez rozbijania na dwa). Wykorzystaj operator groupas (query groupas res zwraca zapamiętany wynik zapytania query w binderze o nazwie res. Wynik ten można dalej przetwarzać korzystając z operatorów niealgebraicznych). 4. *Opracuj zoptymalizowaną postać zapytania Q4. 5. Dodaj optymalizacje przez wyciąganie niezależnych podzapytań do łańcucha optymalizacyjnego ODRA: set optimization independent 6. Zweryfikuj i omów działanie automatycznej optymalizacji na zapytaniach (Q1-Q5). 7. *Oszacuj złożoność obliczeniową zoptymalizowanych zapytań. 3.3. *Zadania dodatkowe 1. Używając poznanych metod optymalizacji zminimalizuj czas wykonania wszystkich przykładowych zapytań. 2. Jakie są negatywne skutki powyższych optymalizacji? Kiedy warto, a kiedy nie warto ich stosować? 3. Napisz test pokazujący optymalizację usuwania martwych podzapytań (parametr: dead).