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).

Podobne dokumenty