Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Konstrukcja systemów obiektowych i rozproszonych Wykładowca: Tomasz Kowalski Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety Wykład 06 Optymalizacja zapytań – wykorzystanie indeksów
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Co to są indeksy? Indeksy są pomocniczymi (redundantnymi) strukturami danych przechowywanymi po stronie serwera. Administrator bazy danych generuje nowe indeksy, o ile rozpozna ich potrzebę, lub je usuwa, jeżeli są nieprzydatne. Indeksy służą do szybkiego wyszukiwania obiektów. Zaletą indeksu jest jego stosunkowo mały rozmiar oraz jednoaspektowość wyszukiwania, co umożliwia ich bardzo efektywną organizację. W najbardziej popularnym ujęciu indeks należy rozumieć jako dwu- kolumnową tablicę, gdzie pierwsza kolumna zawiera wartości kluczowe, zaś druga – wartości niekluczowe, najczęściej referencje do obiektów. Wartości kluczowe są unikalne i służą jako wejście dla procedury wyszukiwania w indeksie. Wynikiem wyszukiwania według danej wartości kluczowej są wartości niekluczowe umieszczone w tym samym wierszu tablicy. Wartości kluczowe są wartościami zapamiętanymi w określonych atrybutach obiektów bazy danych (dla indeksów gęstych) lub są reprezentantami przedziałów tych wartości (dla indeksów zakresowych).
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Mini-baza danych i 1 Prac i 2 Nazwisko Nowak i 3 Zar 2500 i 4 PracujeW i 22 Dział i 23 Nazwa Sprzedaż i 24 Lokacja Radom i 25 Zatrudnia i 26 Zatrudnia i 17 Dział i 18 Nazwa Produkcja i 19 Lokacja Kielce i 21 Zatrudnia i 20 Lokacja Kraków i 9 Prac i 10 Nazwisko Barski i 11 Zar 900 i 16 PracujeW i 13 Miasto Radom i 14 Ulica Wolska i 15 NrDomu 12 i 12 Adres i 5 Prac i 6 Nazwisko Kowalski i 7 Zar 2000 i 8 PracujeW
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Przykładowe indeksy Indeks dla obiektów Prac wg atrybutu Nazwisko (mini-baza) Wartość kluczowa Barski Kowalski Nowak Wartość nie-kluczowa i 9 i 5 i 1 Indeks dla obiektów Dział wg atrybutu Lokacja (mini-baza) Wartość kluczowa Kielce Kraków Radom Wartość nie-kluczowa i 17 i 22 Indeks dla obiektów Prac wg atrybutu Stan Wartość kluczowa analityk kierownik operator programista radca Wartość nie-kluczowa i 15, i 17, i 43 i 72, i 43 i 18, i 22, i 25, i 57 i 22, i 43, i 59, i 48 i 7 Indeks zakresowy dla obiektów Prac wg atrybutu Zar Wartość kluczowa Wartość nie-kluczowa i 15 i 72, i 43 i 18, i 22, i 25 i 25, i 45, i 59, i 48 i 26, i 55 i 29, i 66 i 7
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Fizyczna organizacja indeksów Najbardziej popularną strukturą danych używaną do organizacji indeksów są indeksy z kodowaniem haszującym (hash coding) w bardzo wielu odmianach Prawie równie popularne są indeksy oparte na metodzie zwanej B- drzewem (B-tree, balanced tree), również w bardzo wielu odmianach. Kodowanie haszujące, oparte na funkcji haszującej (hash function) działającej na wartości kluczowej, dostarcza praktycznie jednakowego czasu wyszukiwania dla dowolnego rozmiaru indeksu. Wadą tej metody jest konieczność określenia z góry rozmiaru tablicy indeksu. Wada ta jest wyeliminowana przez tzw. dynamiczne haszowanie (dynamic hashing) lub haszowanie liniowe (linear hashing). Druga wada polega na konieczności rozstrzygania konfliktów (ten sam wynik funkcji haszującej dla różnych wartości kluczowych). Metoda oparta na B-drzewie jest nieco gorsza jeżeli chodzi o czas wyszukiwania i jest wrażliwa na częste aktualizacje indeksu. Jej zaletą jest prostota algorytmu i oszczędność miejsca.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Przezroczystość 6 Oznacza, że programista aplikacji nie musi być świadomy istnienia indeksów Aplikacje koncentrują się na logice biznesowej Administracja indeksami nie zakłóca pracy aplikacji
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Optymalizacja zapytań 7 Redukcja czasu i zasobów koniecznych do ewaluacji zapytania Proces heurystyczny Duża liczba możliwych planów wykonania Optymalność nie w sensie matematycznym Zachowanie semantyki zapytania SELECT e.name, e.dept.name FROM emp e WHERE e.name = 'Smith';
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Automatyczna aktualizacja indeksów 8 BAZA DANYCH OSÓB BAZA DANYCH OSÓB INDEKS OSÓB R. ADAMUS J. ADAMUS T. KOWALSKI K. STACHNIK L. WIŚLICKA L. KULIBERDA J. WIŚLICKI K. KULIBERDA KLUCZ : nazwisko ADAMUS … … KOWALSKI KULIBERDA … STACHNIK WIŚLICKA WIŚLICKI KOWALSKA STACHNIK K. KOWALSKA
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Dwie istotne własności indeksów Przezroczystość indeksów dla programisty baz danych. Programista nie uwzględnia istnienia indeksów w zapytaniach, są one uwzględniane automatycznie. Dzięki temu administrator bazy danych ma pełną swobodę w zakresie generowania nowych indeksów i usuwania indeksów bez konieczności zmiany programów aplikacyjnych. Automatyczna aktualizacja indeksów, która następuje w wyniku zmian w bazie danych. Indeksy, jak wszystkie struktury redundantne, mogą utracić spójność, o ile baza danych zostanie zaktualizowana. Automatyczny mechanizm powinien poprawić, zlikwidować lub od nowa wygenerować indeks w przypadku zmian w bazie danych.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Architektura systemu z indeksami Parser zapytań/programów Środowisko rozwoju oprogramowania (edytor, kompilator, itd.) Klient Drzewo syntaktyczne zapytania/programu Optymalizacja poprzez przepisywanie Optymalizacja poprzez indeksy Interpreter zapytań/programów Lokalny skład danych Stos środowiskowy Stos rezultatów Statyczny stos środowiskowy Statyczny stos rezultatów Baza danych: metabaza, trwałe obiekty, abstrakcje, indeksy,... Zarządzanie obiektami Przetwarzanie trwałych abstrakcji bazujących na zapytaniach Rejestr indeksów Serwer
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Logiczny obraz indeksu (1) Z punktu widzenia języka zapytań, organizacja indeksu i jego własności fizyczne mają znaczenie dla wydajności, lecz nie dla koncepcji. Koncepcyjnie, wszystkie indeksy maja postać funkcji, która przyjmuje argument w postaci stringu, liczby, daty, itp. i zwraca wynik w postaci referencji do obiektu lub do obiektów. Niekiedy funkcje te mają wiele argumentów i/lub mają argument w postaci zbioru. Niektóre typy indeksów (np. indeksy ścieżkowe) zwracają bag struktur referencji do obiektów. Same indeksy są zapamiętane w bazie danych. Informacja o nich jest zapamiętana w specjalnym rejestrze indeksów znajdującym się na serwerze i zarządzanym przez administratora bazy danych. Rejestr przechowuje całą informację niezbędną do automatycznego wykorzystania indeksu przez optymalizator zapytań. Nie będziemy zajmować się organizacją tego rejestru oraz interfejsem jego administratora.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Logiczny obraz indeksu (2) Indeks można uważać za kolekcję zapamiętanych zapytań o jednakowej budowie. Np. indeks IndeksOsobaNazwisko(x), dotyczący nazwisk obiektów Osoba, można uważać za realizację zapytania Osoba where Nazwisko = x, gdzie x jest stringowym parametrem. Dzięki temu, zapytanie o postaci: Osoba where Nazwisko = Nowak można zastąpić wywołaniem funkcji IndeksOsobaNazwisko(Nowak). Reguła zastępowania zapytania przez wywołanie indeksu może być dla niektórych indeksów złożona. Jeżeli zostanie odkryty dostatecznie często spotykany wzorzec zapytania, wówczas dla takiego wzorca można zbudować specjalny indeks, i następnie zastępować zapytania poprzez wywołanie indeksu. Stąd m.in. wynika duża liczba różnych typów indeksów. Do tego dochodzi organizacja fizyczna, która również może być specjalna.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Klasyfikacja indeksów Indeks główny jest obliczony na unikalny klucz kolekcji: dla danego argumentu zwraca dokładnie jedną referencję do obiektu. Np. indeks, którego argumentem (wartością kluczową) jest numer PESEL. Indeks wtórny jest obliczony na atrybut, którego wartość nie jest unikalna dla danej kolekcji obiektów. Np. indeks, którego argumentem (wartością kluczową) jest stanowisko pracownika. Indeks gęsty oznacza, że dla każdej wartości atrybutu występującej w bazie danych tworzona jest pozycja indeksu. Np. dla obiektów Osoba indeks, którego argumentem jest dowolne nazwisko występujące w bazie danych. Indeks zakresowy dotyczy wartości z pewnego zakresu. Np. dla atrybutu zarobek indeks zawiera pozycje z przedziałów 0-99, , ,... Dla nazwisk pozycje mogą mieć postać: nazwiska zaczynające się na A, nazwiska zaczynające się na B,...., nazwiska zaczynające się na Ż. Oprócz tego występują indeksy nie mieszczące się w tej klasyfikacji
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Indeks gęsty Realizuje wzorce zapytań: NazwaObiektu where NazwaAtrybutu = v oraz NazwaObiektu where NazwaAtrybutu v gdzie v jest parametrem. Postępowanie zmierzające do wykorzystania indeksu gęstego IndeksObiektAtrybut nastawionego na indeksowanie obiektów o nazwie NazwaObiektu poprzez wartości atrybutu o nazwie NazwaAtrybutu jest następujące: Poszukujemy w drzewie syntaktycznym fragmentu mającego jedną z następujących postaci:... (NazwaObiektu where NazwaAtrybutu = q) (NazwaObiektu where q = NazwaAtrybutu) (NazwaObiektu where NazwaAtrybutu q) (NazwaObiektu where (p1 and NazwaAtrybutu = q and p2)) (NazwaObiektu where (p1 and q NazwaAtrybutu and p2))...
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Postępowanie z indeksem gęstym q jest dowolnym zapytaniem objętym działaniem operatora where i niezależnym od tego operatora; p, p1, p2 są dowolnymi warunkami, Wiązanie nazwy NazwaObiektu odbywa się w sekcji bazy danych (o numerze 1). W tym celu należy wykorzystać procedurę static_eval, która ustali odpowiednie numery dla wiązania nazw. Jeżeli sekcji bazowych jest więcej niż jedna, należy ustalić, czy wiązanie odbędzie się w sekcji bazy danych. Jeżeli te warunki są spełnione, wówczas odpowiednie fragmenty zapytania należy zastąpić w drzewie syntaktycznym przez fragment drzewa będący wywołaniem funkcji indeksu:...IndeksObiektAtrybut( deref( q ) )... Np. ostatnie 2 postacie należy zastąpić w drzewie syntaktycznym poprzez drzewo powstałe z zapytania:...IndeksObiektAtrybut( deref( q ) ) where (p1 and p2)...
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Przykład – przekształcenie drzewa syntaktycznego 16 Person where ((surname = KOWALSKI) and (age = 28)) $index_idxPerAge(28 groupas $equal) where surname = KOWALSKI;
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Indeksy zakresowe Indeks zakresowy realizuje wzorce zapytań podobne do przypadku indeksu gęstego, ale jego wykorzystanie wiąże się z bardziej złożonymi regułami. Wymagają dopasowania aktualnej wartości występującej w zapytaniu do argumentu tego indeksu, zastosowania go, a następnie dodatkowego odfiltrowania wyniku. Idea indeksu zakresowego polega na indeksowaniu zbioru obiektów przedziałami wartości atrybutu. Np. indeks zakresowy dla zarobku pracownika może określać przedziały: , , ,... Każdy z przedziałów jest jedną pozycją w indeksie. Pozycja indeksu zakresowego może zawierać zero, jedną lub więcej wartości niekluczowych. Zaletą indeksów zakresowych jest zmniejszenie rozmiaru pamięci, szybsze wyszukiwanie oraz mniejsza wrażliwość na aktualizację bazy danych. Indeks zakresowy ułatwia optymalizację w sytuacji, gdy w zapytaniu występuje operator lub..
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Funkcja zakresowa Indeks zakresowy jest skojarzony z funkcją zakresową, która dla dowolnej wartości kluczowej ustala przedział (zakres), do którego należy. Granice przedziału są wyznaczane pojedynczą wartością oraz ustalonym dla danego indeksu rozmiarem przedziału. Np. dla indeksu zakresowego dla zarobków funkcja zakresowa dla wartości 77, 345 i 499 przypisuje wartość 500, dla wartości 555, 763, 879 przypisuje wartość 1000,..., itd.; Istotnym kryterium dla funkcji zakresowej jest równomierność rozmieszczenia wartości niekluczowych w poszczególnych pozycjach indeksu. Jeżeli np. indeks dotyczyłby polskich miejscowości i miałby mieć 10 pozycji, to (na podstawie książki telefonicznej): od Albigowa do Burzenin powinniśmy przypisać wartość 1, od Burzyn do Dzieżgoń wartość 2,... od Wieluń do Żywiec wartość 10. To zapewnia równomierność rozmieszczenia pozycji niekluczowych.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Wykorzystania indeksu zakresowego Jeżeli indeks jest nastawiony na uwzględnianie operatorów oraz, wówczas wartości wyznaczane przez funkcję zakresową muszą mieć ten sam porządek liniowy, który obowiązuje dla wszystkich wartości. Taka funkcja zakresowa jest określana jako zachowująca porządek (order preserving). Jeżeli operatory i są dla danego typu wartości nieistotne, wówczas funkcja zakresowa może być ustalona dowolnie, np. może to być funkcja haszująca. Postępowanie optymalizatora zmierzające do wykorzystania indeksu zakresowego jest bardzo podobne do wykorzystania indeksu gęstego, z dwoma różnicami: Na wartości wyznaczonej przez zapytanie q należy wykonać funkcję zakresową, a dopiero po tym funkcję indeksu; Warunek znajdujący się po operatorze where nie ulega zmianie, gdyż musimy dodatkowo odfiltrować niepotrzebne wartości niekluczowe.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Zmiana drzewa syntaktycznego Przykładowo, jeżeli indeks IndxZakrObiektAtrybut dotyczy obiektów o nazwie NazwaObiektu i jego atrybutu o nazwie NazwaAtrybutu, funkcja zakresowa ma nazwę FunZakrObiektAtrybut, q jest dowolnym zapytaniem objętym działaniem operatora where i niezależnym od tego operatora, NazwaObiektu jest wiązana w sekcji bazy danych, to zapytanie o postaci:... (NazwaObiektu where (p1 and q NazwaAtrybutu and p2))... można przepisać do postaci:... IndxZakrObiektAtrybut( FunZakrObiektAtrybut( deref( q ))) where (p1 and q NazwaAtrybutu and p2))... Odpowiednie modyfikacje drzewa syntaktycznego są podobne do przypadku indeksu gęstego.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Porównania inne niż = Indeksy zakresowe buduje się niekiedy po to, aby uwzględnić optymalizację zapytań z operatorami porównania lub. Odbywa się to poprzez wprowadzenie funkcji, która ustala wszystkie te pozycje indeksu, które na pewno będą spełniać warunek porównania. Np. jeżeli mamy warunek NazwaAtrybutu < q i indeks zarobków dla pracowników, to funkcja FunLtObiektAtrybut(q) dla wartości q = 2450 zwróci sumę wartości niekluczowych z pozycji indeksu mających wartość kluczową 500, 1000, 1500 i Pozycje z przedziału FunZakrObiektAtrybut(deref(q)) mogą warunku nie spełniać, zatem należy je jak poprzednio odfiltrować. Jeżeli funkcja FunLtObiektAtrybut(q) wyznacza te pozycje niekluczowe z indeksu IndxZakrObiektAtrybut, które na pewno spełniają warunek NazwaAtrybutu < q, to zapytanie o postaci... (NazwaObiektu where NazwaAtrybutu < q)... zostanie przepisane do postaci...FunLtObiektAtrybut( q ) (IndxZakrObiektAtrybut( FunZakrObiektAtrybut( deref( q ))) where NazwaAtrybutu < q)... Analogiczne dla innych operatorów.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Kiedy nie da się zastosować indeksu? Podane wyżej wzorce zapytań nie zawsze umożliwiają zastosowanie indeksu. Indeksu nie da się zastosować, jeżeli nazwa obiektu nie wiąże się w dolnej sekcji stosu (sekcji bazy danych). Indeksu nie da się zastosować, jeżeli obiekty identyfikuje pewne wyrażenie różne od nazwy tych obiektów (np. wywołanie funkcji). Indeksu nie da się również zastosować, jeżeli q występujące w przytoczonych wyżej zapytaniach jest zależne od najbliższego operatora where. Przykładowo, zapytanie: Prac where Zar > (Wiek * 100) uniemożliwia zastosowanie indeksu IndeksPracZar, gdyż zapytanie Wiek jest zależne od najbliższego operatora where.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Wybór indeksu do optymalizacji W niektórych sytuacjach użycie dwóch lub więcej indeksów jest utrudnione lub niemożliwe. Przykładowo, w zapytaniu: Prac where Nazwisko = Nowak and Zar = 2000 można byłoby użyć indeksu IndeksPracNazwisko lub IndeksPracZar, ale nie obu. Po przekształceniu zapytania poprzez użycie jednego z nich, np. do postaci: IndeksPracNazwisko(Nowak) where Zar = 2000 użycie drugiego nie spełnia warunków ustalonych przez nas poprzednio. Możemy to zapytanie przekształcić do postaci: IndeksPracZar( 2000 ) where Nazwisko = Nowak ale wtedy użycie indeksu nazwisk stanie się niemożliwe. Można skorzystania z operatora przecięcia zbiorów: IndeksPracNazwisko(Nowak) IndeksPracZar( 2000 ) ale nie jest pewne, czy będzie to opłacalne: Nie bardzo wiadomo, które rozwiązanie jest najlepsze. Wybór może wspomóc model kosztów ewaluacji zapytania.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Model kosztów Ponieważ kolekcje obiektów w bazie danych mogą mieć różny rozmiar, różne proporcje wzajemne, różne cechy logiczne i fizyczne itd., zbudowanie teoretycznego modelu kosztów jest niemożliwe. Model kosztów jest modelem heurystyczno-empirycznym, który można uzyskać na bazie wielu eksperymentów w realnym środowisku. Model ten może korzystać ze wszystkich mierzalnych własności indeksów oraz metamodelu bazy danych. W grę wchodzą następujące elementy tego modelu: Rozmiar indeksowanych zbiorów obiektów; Selektywność indeksów, tj. ile przeciętnie wartości niekluczowych jest dostarczanych w wyniku skorzystania z indeksu; Czas odczytania obiektu z pamięci dyskowej (lub innej pamięci trwałej); Czas realizacji operatorów użytych w przekształconym zapytaniu, np. operatora przecięcia zbiorów; Selektywność warunku znajdującego się po operatorze where, tj. wyrażona w procentach ilość wyselekcjonowanych obiektów. Możliwe jest wiele innych czynników.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Możliwości obecnych systemów 25 Lokalne i globalne indeksowanie oparte na statycznym partycjonowaniu Definicja klucza indeksowania oparta o złożoną funkcję (np. function-based indices w O-R bazie Oracle) w praktyce ograniczona do danej kolekcji lub tabeli (błędy automatycznej aktualizacji!) wyrażenie ścieżkowe (tylko GemStone) Brak metod opartych na globalnym indeksowaniu dla obiektowych zapytań odnoszących się do heterogenicznych rozproszonych zasobów
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Elementy składowe architektury 26 Zarządzanie – Menadżer Indeksów Struktura – Liniowy Hashing Mechanizmy zapewniające przezroczystość: –optymalizator zapytań –mechanizm aktualizacji indeksów Testowa implementacja – prototyp obiektowej bazy danych ODRA
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Automatyczna aktualizacja indeksu 27 Trygery Aktualizacji Indeksu powiązane z konkretnymi obiektami MENADŻER INDEKSÓW INDEKSY BAZY DANYCH DEFINICJE TRYGERÓW TRYGERY AKTUALIZACJI INDEKSU MENADŻER TRYGERÓW MECHANIZM AKTUALIZACJI INDEKSÓW INTERPRETER SBQL ROZSZERZENIE MECHANIZMU WIĄZANIA (BIND): - MONITOR OBIEKTÓW - LIMITOWANIE WIĄZANIA C.R.U.D. bazy (CREATE, READ, UPDATE, DELETE) OBSŁUGA TRYGERÓW AKTUALIZACJI GENERACJA INDEKSU WYPEŁNIENIE INDEKSU DODAWANIE USUWANIE TRYGERÓW TRYGER AKTUALIZACJI MODYFIKACJA BAZY AKTUALIZACJA GLOBALNE ELEMENTY ARCHITEKTURY Teza I: Przetwarzanie predykatów selekcji opartych o dowolne wyrażenia kluczowe korzystające z danych w rozproszonej obiektowej bazie danych może być zoptymalizowane przez scentralizowane lub rozproszone przezroczyste indeksowanie.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Właściwości aktualizacji indeksu 28 Przezroczystość i generyczność Obsługa dowolnych wyrażeń kluczowych SBQL Procedury aktualizacyjne dotyczą tylko obiektów wpływających na indeks Możliwe usprawnienia, np.: dla kluczy prostych i wyrażeń ścieżkowych przez tzw. leniwą aktualizacji Person -> age Person -> address.city Emp -> getTotalIncomes() Dept -> sum(employs.Emp.salary)*12 Teza I: Przetwarzanie predykatów selekcji opartych o dowolne wyrażenia kluczowe korzystające z danych w rozproszonej obiektowej bazie danych może być zoptymalizowane przez scentralizowane lub rozproszone przezroczyste indeksowanie.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Teza II: Wykonywanie złożonych zapytań odnoszących się do rozproszonych heterogenicznych zasobów może być wspomagane przez techniki wykorzystujące przezroczystą optymalizację opartą o indeksowanie. Polega na tej samej architekturze, co normalne indeksy z wyłączeniem automatycznej aktualizacji indeksu Jest materializowany tylko podczas wykonywania zapytania Może być stosowany do przetwarzania: –wirtualnych danych - perspektywy SBQL –zasobów heterogenicznych Technika ulotnego indeksowania
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Metodyka stosowania ulotnego indeksu 30 Teza II: Wykonywanie złożonych zapytań odnoszących się do rozproszonych heterogenicznych zasobów może być wspomagane przez techniki wykorzystujące przezroczystą optymalizację opartą o indeksowanie. Skuteczny w zapytaniach, w których indeks jest wywołany więcej niż raz powinno zwracać kolekcję wykonywane wielokrotnie zapytanie niezależne wartości zależne od operatora (np. kropka, join, where, orderby) += można użyć ulotny indeks
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Schemat testowy 31 Teza II: Wykonywanie złożonych zapytań odnoszących się do rozproszonych heterogenicznych zasobów może być wspomagane przez techniki wykorzystujące przezroczystą optymalizację opartą o indeksowanie. Globalny obiektowy schemat Schemat relacyjny Rzeczywiste obiektowe dane Perspektywy SBQL - relacyjne dane Przezroczysta integracja zasobów relacyjnych dzięki generycznej osłonie (Jacek Wiślicki) Międzynarodowy grant eGov-bus O R
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Zapytanie ad-hoc 32 Teza II: Wykonywanie złożonych zapytań odnoszących się do rozproszonych heterogenicznych zasobów może być wspomagane przez techniki wykorzystujące przezroczystą optymalizację opartą o indeksowanie. Zwróć połączone imię i nazwisko każdego pracownika firmy O wraz z liczbą pracowników firmy R, którzy pracują w takim samym dziale, co dany pracownik, i więcej od niego zarabiają Emp as empaux. (empaux.name + " " + empaux.surname, (empaux.worksIn.Dept.name as deptnameaux). ((empaux.salary as empsalaryaux). count(RDBMSEmp where worksIn.RDBMSDept.name = deptnameaux and salary > empsalaryaux))) Optymalizacja lokalna lub globalna
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Drogi ewaluacji podzapytania 33 Wykonywane dla każdego pracownika firmy O exec_immediately("select employees.info, employees.department_id, employees.surname, employees.salary, employees.id, employees.sex, employees.name, employees.birth_date, departments.name from employees, departments where ((departments.id = employees.department_id) AND (departments.id = departments.id))") Tworzenie ulotnego indeksu - SBQL Teza II: Wykonywanie złożonych zapytań odnoszących się do rozproszonych heterogenicznych zasobów może być wspomagane przez techniki wykorzystujące przezroczystą optymalizację opartą o indeksowanie. 1.Natywna optymalizacja zasobu relacyjnego exec_immediately("select COUNT(*) from employees, departments where departments.name = '" + deptnameaux + "' AND departments.id = employees.department_id AND employees.salary > '" + empsalaryaux + "'") Selekcja po kolumnie indeksowanejFunkcja agregującaZłączenia po kolumnach PK/FK 2.Technika Ulotnego Indeksowania count($vltlIdxRDBMSEmp(deptnameaux groupas $equal; (empsalaryaux, E308, false, true) groupas $range)))) RDBMSEmp join (worksIn.RDBMSDept.name, salary) Tworzenie ulotnego indeksu - SQLWykonywane tylko jeden raz!
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Wynik optymalizacji Dla dużej liczby wywołań ulotnego indeksu przyspieszenie ponad 40-krotne 34 Teza II: Wykonywanie złożonych zapytań odnoszących się do rozproszonych heterogenicznych zasobów może być wspomagane przez techniki wykorzystujące przezroczystą optymalizację opartą o indeksowanie. [sekundy]
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Problem niewydajnej selekcji LINQ Zapytanie LINQ – znajdź produkty, których cena jest unikalna w całej kolejkcji produktów (czyli występuje tylko raz): var result = from p in products where (from p2 in products where p2.UnitPrice == p.UnitPrice select p2).Count() == 1 select p; Optymalizacja występuje w przypadku providera LINQ do bazy danych, np. LINQ to SQL Złożność kwadratowa O(n 2 ) dla: LINQ to Objects LINQ to XML LINQ to Dataset itd.
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Natywna postać zapytania w C# Zapytanie LINQ kompilator C# tłumaczy na wyrażenie wykorzystujące Extension Methods wprowadzone przez bibliotekę LINQ oraz funkcje wyższego rzędu (Higher-order functions): var result = products.Where(p => products. Where(p2 => (p2.UnitPrice == p.UnitPrice)).Count() == 1) Semantycznie równoważne. Analogia do operatorów niealgebraicznych SBA: where – selekcja, czyli operator where, select – projekcja, czyli operator kropki, p oraz p2 pełnią rolę nazw pomocniczych – w SBA używany do tego operator as. products as p where count(products where UnitPrice = p.UnitPrice) = 1
Konstrukcja systemów obiektowych i rozproszonych, Wykład 06, Slajd Metoda ulotnego indeksowania LINQ Brak operatora groupas wymusza korzystanie ze sztuczek: var result = products.GroupBy(g => 0).Select(pgroup => pgroup.ToLookup(p => p.UnitPrice)). SelectMany(plook => products. Where(p => plook[p.UnitPrice].Count() == 1) Semantycznie równoważne. Złożność O(n*log(n))! – GroupBy powoduje materializację, a ToLookup poindeksowanie kolekcji wg predykatu, który jest jego parametrem.