370 likes | 520 Views
Konstrukcja systemów obiektowych i rozproszonych. Wykład 06 Optymalizacja zapytań – wykorzystanie indeksów. Wykładowca : Tomasz Kowalski Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety. Co to są indeksy?.
E N D
Konstrukcja systemów obiektowych i rozproszonych Wykład 06 Optymalizacja zapytań – wykorzystanie indeksów Wykładowca: Tomasz Kowalski Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety
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).
Mini-baza danych i1Prac i5Prac i9Prac i10 Nazwisko ”Barski” i2 Nazwisko ”Nowak” i6 Nazwisko ”Kowalski” i11 Zar 900 i3 Zar 2500 i7 Zar 2000 i12 Adres i4 PracujeW i8 PracujeW i13 Miasto ”Radom” i14 Ulica ”Wolska” i15 NrDomu 12 i16 PracujeW i17Dział i22Dział i18 Nazwa ”Produkcja” i23 Nazwa ”Sprzedaż” i19 Lokacja ”Kielce” i24 Lokacja ”Radom” i20 Lokacja ”Kraków” i25 Zatrudnia i21 Zatrudnia i26 Zatrudnia
Przykładowe indeksy Wartość kluczowa analityk kierownik operator programista radca Wartość nie-kluczowa i15, i17, i43 i72, i43 i18, i22, i25, i57 i22, i43, i59, i48 i7 Indeks dla obiektów Prac wg atrybutu Nazwisko (mini-baza) Indeks dla obiektów Dział wg atrybutu Lokacja (mini-baza) Wartość kluczowa Barski Kowalski Nowak Wartość nie-kluczowa i9 i5 i1 Wartość kluczowa Kielce Kraków Radom Wartość nie-kluczowa i17 i17 i22 Indeks zakresowy dla obiektów Prac wg atrybutu Zar Indeks dla obiektów Prac wg atrybutu Stan Wartość kluczowa 500 1000 1500 2500 4500 5000 7500 Wartość nie-kluczowa i15 i72, i43 i18, i22, i25 i25, i45, i59, i48 i26, i55 i29, i66 i7
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.
Przezroczystość • Oznacza, że programista aplikacji nie musi być świadomy istnienia indeksów • Aplikacje koncentrują się na logice biznesowej • Administracja indeksami nie zakłóca pracy aplikacji
Optymalizacja zapytań • 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 SELECTe.name, e.dept.nameFROMempeWHEREe.name = 'Smith';
Automatyczna aktualizacja indeksów BAZA DANYCH OSÓB INDEKSOSÓB T. KOWALSKI L. KULIBERDA KOWALSKA R. ADAMUS K. KOWALSKA K. STACHNIK J. WIŚLICKI STACHNIK J. ADAMUS K. KULIBERDA L. WIŚLICKA
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.
Architektura systemu z indeksami Środowisko rozwoju oprogramowania (edytor, kompilator, itd.) Parser zapytań/programów Drzewo syntaktyczne zapytania/programu Optymalizacja poprzez przepisywanie Optymalizacja poprzez indeksy Interpreter zapytań/programów Statyczny stos środowiskowy Stos środowiskowy Statyczny stos rezultatów Stos rezultatów Klient Lokalny skład danych Rejestr indeksów Zarządzanie obiektami Przetwarzanie trwałych abstrakcji bazujących na zapytaniach Serwer Baza danych: metabaza, trwałe obiekty, abstrakcje, indeksy,...
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.
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 OsobawhereNazwisko = x, gdzie x jest stringowym parametrem. • Dzięki temu, zapytanie o postaci: OsobawhereNazwisko = ”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.
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, 100-199, 200-299, ... • 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
Indeks gęsty • Realizuje wzorce zapytań: NazwaObiektuwhereNazwaAtrybutu = v oraz NazwaObiektuwhereNazwaAtrybutuv 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: ... (NazwaObiektuwhereNazwaAtrybutu = q) ... ... (NazwaObiektuwhereq = NazwaAtrybutu) ... ... (NazwaObiektuwhereNazwaAtrybutuq) ... ...... ... (NazwaObiektuwhere (p1andNazwaAtrybutu = qand p2)) ... ... (NazwaObiektuwhere (p1andqNazwaAtrybutuand p2)) ...
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 (p1andp2)...
Przykład – przekształcenie drzewa syntaktycznego Personwhere ((surname = “KOWALSKI”) and (age = 28)) $index_idxPerAge(28 groupas$equal)where surname = “KOWALSKI”;
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: 1-500, 501-1000, 1001-1500, ... 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 ..
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.
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.
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: ... (NazwaObiektuwhere (p1andqNazwaAtrybutuand p2)) ... można przepisać do postaci: ... IndxZakrObiektAtrybut( FunZakrObiektAtrybut( deref( q ))) where (p1andqNazwaAtrybutuand p2)) ... • Odpowiednie modyfikacje drzewa syntaktycznego są podobne do przypadku indeksu gęstego.
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 2000. • 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 ... (NazwaObiektuwhereNazwaAtrybutu < q) ... zostanie przepisane do postaci ...FunLtObiektAtrybut( q ) (IndxZakrObiektAtrybut( FunZakrObiektAtrybut( deref( q ))) whereNazwaAtrybutu < q) ... • Analogiczne dla innych operatorów.
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: PracwhereZar > (Wiek * 100) uniemożliwia zastosowanie indeksu IndeksPracZar, gdyż zapytanie Wiek jest zależne od najbliższego operatora where.
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.
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.
Możliwości obecnych systemów • 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
Elementy składowe architektury • 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
Automatyczna aktualizacja indeksu • Trygery Aktualizacji Indeksu powiązane z konkretnymi obiektami TRYGERY AKTUALIZACJI INDEKSU DEFINICJE TRYGERÓW MENADŻER INDEKSÓW MENADŻER TRYGERÓW GENERACJA INDEKSU INDEKSY BAZY DANYCH MECHANIZM AKTUALIZACJIINDEKSÓW WYPEŁNIENIE INDEKSU TRYGERAKTUALIZACJI AKTUALIZACJA GLOBALNEELEMENTYARCHITEKTURY INTERPRETER SBQL C.R.U.D. bazy (CREATE, READ, UPDATE, DELETE) DODAWANIE USUWANIE TRYGERÓW ROZSZERZENIE MECHANIZMU WIĄZANIA (BIND): - MONITOR OBIEKTÓW- LIMITOWANIE WIĄZANIA OBSŁUGA TRYGERÓWAKTUALIZACJI MODYFIKACJA BAZY 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.
Właściwości aktualizacji indeksu • 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.
Technika ulotnego indeksowania • 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 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.
Metodyka stosowania ulotnego indeksu • Skuteczny w zapytaniach, w których indeks jest wywołany więcej niż raz (np. kropka, join, where, orderby) powinno zwracać kolekcję zapytanie niezależne + wartości zależne od operatora = można użyć ulotny indeks wykonywane wielokrotnie 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.
Schemat testowy • Globalny obiektowy schemat Rzeczywiste obiektowe dane O Perspektywy SBQL - relacyjne dane R Przezroczysta integracja zasobów relacyjnych dzięki generycznej osłonie(Jacek Wiślicki) Międzynarodowy grant eGov-bus • Schemat relacyjny 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.
Zapytanie ad-hoc • Zwróć połączone imię i nazwisko każdego pracownika firmy O wraz z liczbą pracowników firmy R, którzypracują w takim samym dziale, co dany pracownik, i więcej od niego zarabiają Empasempaux.(empaux.name + " " + empaux.surname, (empaux.worksIn.Dept.nameasdeptnameaux). ((empaux.salaryasempsalaryaux).count(RDBMSEmpwhereworksIn.RDBMSDept.name = deptnameaux andsalary > empsalaryaux))) Optymalizacja lokalna lub globalna 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.
Drogi ewaluacji podzapytania • Natywna optymalizacja zasobu relacyjnego exec_immediately("selectCOUNT(*) fromemployees, departmentswheredepartments.name = '" + deptnameaux + "' ANDdepartments.id = employees.department_idANDemployees.salary > '" + empsalaryaux + "'") Wykonywane dla każdego pracownika firmy O Selekcja po kolumnie indeksowanej Funkcja agregująca Złączenia po kolumnach PK/FK • Technika Ulotnego Indeksowania exec_immediately("selectemployees.info,employees.department_id, employees.surname, employees.salary, employees.id, employees.sex, employees.name, employees.birth_date, departments.namefromemployees, departmentswhere ((departments.id = employees.department_id) AND (departments.id = departments.id))") count($vltlIdxRDBMSEmp(deptnameauxgroupas$equal; (empsalaryaux, 1.7976931348623157E308, false, true) groupas$range)))) RDBMSEmp join (worksIn.RDBMSDept.name, salary) Tworzenie ulotnego indeksu - SBQL Tworzenie ulotnego indeksu - SQL Wykonywane tylko jeden raz! 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.
Wynik optymalizacji Dla dużej liczby wywołań ulotnego indeksu przyspieszenie ponad 40-krotne [sekundy] 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.
Problem niewydajnej selekcji LINQ • Zapytanie LINQ – znajdź produkty, których cena jest unikalna w całej kolejkcji produktów (czyli występuje tylko raz): varresult = from pin productswhere (fromp2in products where p2.UnitPrice== p.UnitPriceselectp2).Count() == 1select p; • Optymalizacja występuje w przypadku providera LINQ do bazy danych, np. LINQ to SQL • Złożność kwadratowa O(n2) dla: • LINQ to Objects • LINQ to XML • LINQ to Dataset • itd.
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): varresult=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 asp where count(productswhereUnitPrice = p.UnitPrice) = 1
Metoda ulotnego indeksowania LINQ • Brak operatora groupas wymusza korzystanie ze „sztuczek”: varresult=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))! – GroupBypowoduje materializację, a ToLookuppoindeksowanie kolekcji wg predykatu, który jest jego parametrem.