Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd 1 2011 Języki i środowiska programowania systemów rozproszonych Wykładowca:

Slides:



Advertisements
Podobne prezentacje
Konstrukcja systemów obiektowych i rozproszonych
Advertisements

Indeksy w bazie danych Oracle
Język C/C++ Funkcje.
Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Obiektowe języki zapytań
© K.Subieta. Obiektowe języki zapytań 08, Folia 1 kwiecień 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
Wzorce.
© K.Subieta. Obiektowe języki zapytań 14, Folia 1 czerwiec 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
Bazy danych i inżynieria oprogramowania
© K.Subieta. Konstrukcja systemów obiektowych i rozproszonych 3, Folia 1 październik 2004 Konstrukcja systemów obiektowych i rozproszonych Wykładowca:
PROGRAMOWANIE STRUKTURALNE
© K.Subieta. Obiektowe języki zapytań 12, Folia 1 maj 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
© K.Subieta. Konstrukcja systemów obiektowych i rozproszonych 1, Folia 1 październik 2004 Konstrukcja systemów obiektowych i rozproszonych Wykładowca:
© K.Subieta. Obiektowe języki zapytań 09, Folia 1 maj 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
© K.Subieta. Obiektowe języki zapytań 13, Folia 1 czerwiec 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
© K.Subieta. Obiektowe języki zapytań 07, Folia 1 kwiecień 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
MS Access 2003 Kwerendy Paweł Górczyński.
MS Access 2000 Kwerendy Piotr Górczyński 25/08/2001.
Domknięcie przechodnie (również) w bazach danych
PySBQL Język zapytań dla obiektowych baz danych. Aplikacje bazodanowe Główny nurt budowania aplikacji opiera się na połączeniu: SQL JDBC Java Jak wyświetlić
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Język SQL – zapytania zagnieżdżone (podzapytania)
Struktury.
Bezpieczeństwo Procedury składowane Funkcje i Wyzwalacze
SQL-owskie szlaki górskie
Zapytania SQL: wydajność i optymalizacja
Wykład 8 Wojciech Pieprzyca
BD-LAB6 Wojciech Pieprzyca
WYKONYWANIE ZAPYTAŃ Przygotował Lech Banachowski na podstawie: 1.Raghu Ramakrishnan, Johannes Gehrke, Database Management Systems, McGrawHill, 2000 (książka.
Modele baz danych - spojrzenie na poziom fizyczny
Teoria relacyjnych baz danych
Bazy Danych II prowadzący: mgr inż. Leszek Siwik
OPERACJA DZIELENIA W SQL
SQL – Structured Query Language (3)
Podejście stosowe do obiektowych języków programowania baz danych
Podstawy programowania
Podstawy programowania II
Automatyczne dereferencje w języku SBQL
Programowanie strukturalne i obiektowe
Języki i środowiska programowania systemów rozproszonych, Wykład 06, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 02, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 11, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Języki i środowiska programowania systemów rozproszonych, Wykład 10, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 09, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 01 SBA&SBQL, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 03, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 07, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 01, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Rozwiązanie zadań do zaliczenia I0G1S4 // indeks
Programowanie obiektowe 2013/2014
Autor: Joanna Barańska Promotor: dr inż. Paweł Figat Konsultant:
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
Podstawy programowania
Programowanie strukturalne i obiektowe C++
Model obiektowy bazy danych
© K.Subieta. Obiektowe języki zapytań 15, Folia 1 czerwiec 2004 Obiektowe języki zapytań Wykładowca: Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik.
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
Temat: Tworzenie bazy danych
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
Konstrukcja systemów obiektowych i rozproszonych
Obiektowe języki zapytań
Haskell Składnia funkcji.
Obiektowe języki zapytań
Obiektowe języki zapytań
Modele baz danych - spojrzenie na poziom fizyczny
Zapis prezentacji:

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca: Tomasz Kowalski Wykłady przygotowane na podstawie materiałów prof. Kazimierza Subiety Wykład 12 Reguły zakresu Procedury rekurencyjne Optymalizacja poprzez modyfikację zapytań

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Reguły zakresu Reguły zakresu są wyznaczone przez kolejność ustawienia sekcji ENVS oraz regułami ich przesłaniania - powinny być naturalne i logiczne dla programistów. Nie zawsze jest to oczywiste. Np. dlaczego podczas wiązania nazwy występującej w ciele metody najpierw jest odwiedzana sekcja z prywatnymi własnościami klasy/obiektu, a dopiero później z publicznymi? Dlaczego nie odwrotnie? Gdyby ta kolejność została zmieniona, własności semantyczne języka również uległyby zmianie, gdyż różne sekcje mogą posiadać bindery z tymi samymi nazwami. W obiektowości jest kilka sytuacji, gdy nie da się uniknąć binderów z tymi samymi nazwami na stosie środowiskowy. Istotą koncepcji stosu środowiskowego jest to, aby nie dopuszczać do wiązania, które nie jest oczekiwane przez programistę. Regułami zakresu rządzi zdrowy rozsadek oraz dwie zasady: zasada priorytetu lokalnego środowiska zasada leksykalnego zakresu.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Zasady rządzące regułami zakresu Zasada priorytetu lokalnego środowiska: Przy wiązaniu nazw lokalne środowisko ma priorytet przed dowolnym środowiskiem bardziej globalnym. Na mocy tej zasady na samej górze stosu ENVS znajduje się lokalne środowisko metody, niżej jest środowisko przetwarzanego obiektu, jeszcze niżej środowisko sesji, potem środowisko bazy danych, wreszcie środowisko całego systemu komputerowego. Zasada ta jest podstawą zagnieżdżania operatorów nie-algebraicznych. Zasada leksykalnego zakresu (lexical scoping): Nazwa nie może być wiązana do bytu, którego nie mógł być świadomy programista w momencie pisania zapytania lub programu. Dotyczy to: lokalnych środowisk innych procedur, wszelkich własności prywatnych (obiektów, klas, modułów), kodów, które pojawią się niezależnie i później niż moment pisania danego zapytania lub programu.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Przykład skutków reguł zakresu Rozpatrzmy zapytanie q 1 q 2 i załóżmy, że aktualnie wykonywana jest metoda m 1 występująca w q 2 i przetwarzająca referencję r i. Niech powyższe zapytanie występuje wewnątrz ciała metody m 2, która została wywołana z procedury p. Sytuacja na stosie środowiskowym: Zilustrowana jest zasada leksykalnego zakresu: programista piszący metodę m 1 nie znał środowisk zaznaczonych na rysunku na czarno, wobec czego nazwy występujące w m 1 nie mogą być w nich wiązane. Kolejność wiązania nazw występujących w ciele m 1 Sekcje wywołania m 1 dla r i Sekcje indukowane przez q 2, w którym znajduje się wołanie metody m 1 Sekcje indukowane przez dla r i Sekcje indukowane przez wywołanie m 2 Sekcje indukowane przez wywołanie p Sekcje bazowe ENVS

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Ścisłe wołanie przez wartość (strict-call-by-value) Zróżnicowanie na wołanie przez wartość i wołanie przez referencję nie zawsze jest korzystne. Wymaga odrębnej składni oraz powoduje ograniczenia jeżeli chodzi o rodzaj komunikowanej wartości. W języku C takie zróżnicowanie nie występuje: parametr pointerowy jest przekazywany do ciała procedury bez zmian. W systemie Loqis zdecydowaliśmy się wprowadzić tę metodę w wariancie Pascala, tj. bez tworzenia lokalnego obiektu. Składnia deklaracji procedury z takim parametrem będzie następująca: procedure NazwaProcedury(...; NazwaParam;...){...ciało...} Składnia wywołania, jak poprzednio: NazwaProcedury(...; zapytanie;...) Powyższe zapytanie może zwrócić dowolny rezultat r Rezultat zbudowany z referencji, wartości, nazw i konstruktorów struktur i kolekcji. Rezultat ten jest bez zmian przekazywany do ciała procedury w ten sposób, że do jej zapisu aktywacyjnego wstawia się pojedynczy binder NazwaParam( r ). W ten sposób metoda ta łączy wołanie przez wartość z wołaniem przez referencję oraz posiada dalsze możliwości, niedostępne w tych metodach.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Przykład ścisłego wołania przez wartość Parametrem komuIle procedury ZmieńZarobek jest bag struktur struct{ komu(r), ile(w) }, gdzie r jest referencją do obiektu pracownika, w jest jego nowym zarobkiem. Procedura przyznaje ten nowy zarobek tym pracownikom, dla których jest on większy od ich aktualnego zarobku. W razie konfliktu (jeżeli referencja danego pracownika wystąpi wielokrotnie), wybiera maksymalną z możliwych nowych wartości zarobku. procedure ZmieńZarobek ( komuIle ) { for each distinct( komuIle.komu ) as p do p.Zar := max( bag( p.Zar, (komuIle where komu = p). ile))} Pracownikom z Radomia udziel podwyżki w wysokości 100, pracownikom po 40-tce udziel podwyżki w wysokości 200, zaś wszystkim sekretarkom ustal zarobek na 1000 (z uwzględnieniem ew. innych kryteriów dających więcej). ZmieńZarobek ( bag( ((Prac where Radom PracujeW.Dział.Lokacja) as komu join (komu.zar + 100) as ile), ((Prac where Wiek > 40) as komu join (komu.zar + 200) as ile), ((Prac where Stan = sekretarka) as komu, 1000 as ile)))

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Procedury rekurencyjne Podejście stosowe zakłada rekurencję jako własność oczywistą. Umożliwienie określania parametrów procedur w postaci zapytań oraz zwracania wyniku procedur w postaci dowolnej wartości dziedziny Rezultat stwarza nową jakość, która dotychczas była kwalifikowana jako własność inteligentna, specyficzna dla dedukcyjnych baz danych. Przy pomocy rekurencyjnych procedur można bez trudu osiągnąć efekty tranzytywnych domknięć oraz równań stało-punktowych. Mimo różnic składniowych i semantycznych, są to mechanizmy porównywalne pragmatycznie. Z doświadczeń autora wynika, że procedury rekurencyjne są bardziej zrozumiałe dla powszechnego programisty, być może wskutek praktyki edukacyjnej.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Schemat struktury hierarchicznej części wyrobu Część[0..*] nazwa rodzaj kosztDet[0..1] masaDet[0..1] kosztMont[0..1] masaMont[0..1] składnik[0..*] ilość prowadziDo detal, agregat

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Przykład funkcji rekurencyjnej Procedura Podczęści ma parametr mojeCzęści bedącego bagiem referencji do części. Procedura zwraca bag z referencjami do wszystkich pod-części części wymienionych w parametrze. Duplikaty w wyniku nie są usuwane. Przy transmisji parametrów przyjmujemy metodę ścisłego wołania przez wartość. procedure Podczęści (mojeCzęści ) { return if not exists( mojeCzęści ) then bag{} else bag( mojeCzęści, Podczęści(mojeCzęści.składnik.prowadziDo.Część))} Podaj nazwy wszystkich części detalicznych składających się na samolot Boeing 767: distinct( Podczęści( Część where nazwa = Boeing 767 ) where rodzaj = detal).nazwa

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Inny przykład na rekurencję Obiekty Osoba mają atrybuty nazwisko, rokUr (rok urodzenia), żyje (z wartością boolowską), oraz są powiązane związkami rodzinnymi matka, ojciec, syn, córka, zaimplementowanymi jako obiekty pointerowe umieszczone wewnątrz obiektów Osoba. Procedura Przodek zwraca wszystkich przodków osób zakomunikowanych jako parametr. Procedura Następca zwraca wszystkich następców osób zakomunikowanych jako parametr. procedure Przodek( mojeOsoby) { return if not exists(mojeOsoby) then bag{} else distinct( bag(mojeOsoby, Przodek(mojeOsoby.(matka ojciec).Osoba)))} procedure Następca( mojeOsoby) {return if not exists(mojeOsoby) then bag{} else distinct( bag(mojeOsoby, Następca (mojeOsoby.(syn córka).Osoba)))} Podaj nazwisko i rok urodzenia wszystkich żyjących kuzynów Kowalskiego, którzy są od niego młodsi: (((Osoba where nazwisko = Kowalski) as kow) join (Następca(Przodek( kow )) as kuzyn) where (kow.rokUr < kuzyn.rokUr and kuzyn.żyje)).(kuzyn.(nazwisko, rokUr))

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Modyfikacja zapytań Modyfikacja zapytań jest podstawową metodą optymalizacji zapytań używających perspektyw. Jest stosowana we wszystkich systemach relacyjnych. Ponieważ pojęcie perspektywy, tak jak jest ono wprowadzone w systemach relacyjnych, jest równoważne procedurze funkcyjnej, w istocie metoda modyfikacji zapytań dotyczy tych ostatnich. Pokażemy jednak dalej, że ma ona zastosowanie również dla aktualizowalnych perspektyw. Metoda została sformułowana przez M.Stonebrakera w 1975 roku, ale wskutek braku ortogonalności ówczesnych języków zapytań (w szczególności QUEL i SQL) sformułowanie jest bardzo złożone i niejasne. Wydawało się wówczas, że jest ona całkowicie oryginalnym wynalazkiem. Okazało się, że przy założeniu pełnej ortogonalności języka (cecha SBQL) i przy przyjęciu tezy, że perspektywa jest procedurą funkcyjną, metoda ta jest wariantem metody, która była znana już w latach 60-tych i powszechnie stosowana w optymalizacji programów.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Modyfikacja zapytań = makro-substytucja Metoda modyfikacji zapytań polega na tym, że definicję funkcji traktuje się jako makro-definicję. Wszędzie tam, gdzie w zapytaniach występuje nazwa funkcji, zastępuje się tę nazwę poprzez tekst będący definicją tej nazwy (pomijając nieistotne elementy leksykalne). Po tym zabiegu uzyskuje się zapytanie bez odwołań do funkcji. Poddaje się go następnie innym metodom optymalizacyjnych. Aby metoda ta prowadziła do semantycznie poprawnych konstrukcji i nie zmieniała znaczenia zapytania, jej zastosowanie wymaga wprowadzenia ograniczeń na postać deklaracji funkcji: Funkcja nie może mieć lokalnego środowiska, w szczególności, nie może mieć parametrów. Funkcja nie może być także rekurencyjna, pośrednio lub bezpośrednio, gdyż prowadziłoby to do nieskończonej pętli stosowania makro-definicji. Środowisko w którym wywoływana jest funkcja jest takie samo jak środowisko, w którym ewaluowane jest zapytanie wewnątrz tej funkcji. Funkcja powinna mieć postać procedure NazwaFunkcji { return zapytanie} równoważną pojedynczemu zapytaniu.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Dlaczego w SQL jest to skomplikowane? Brak ortogonalności, chaotyczność konstrukcji SQL powoduje powstanie w tej materii skomplikowanych algorytmów. Jedną z przyczyn skomplikowania metody modyfikacji zapytań w systemach relacyjnych jest brak formalnej semantyki pomocniczych nazw. Jest ona niewyrażalna w algebrze relacji, rachunku relacyjnym i stosowanych w tym celu logikach, zatem oparcie semantyki języka zapytań na tych formalizmach powoduje poważne ograniczenia. Definicje perspektyw w SQL określają w nagłówku nazwy wirtualnych atrybutów, zatem wstawienie ciała definicji jako fragmentu zapytania wymaga odpowiednich operacji na tych nazwach. Prac NrP Nazwisko Stan Zar PracujeW Dział NrD Nazwa Szef Lokacje NrD Lokacja Adres NrP Miasto Ulica NrDomu Schemat relacyjny

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Przykład w SQL Definicja perspektywy w SQL ma postać: create view PracSzef( Naz, NazD, NazSzefa) as select p.Nazwisko, d.Nazwa, s.Nazwisko from Prac p, Dział d, Prac s where p.PracujeW = d.NrD and d.Szef = s.NrP Nowe nazwy Naz, NazD, NazSzefa są nazwami kolumn wirtualnej tabeli, które można używać w zapytaniach, np.: Podaj nazwiska i nazwy działów pracowników nazywających się tak samo jak ich szef): select p.Naz, p.NazD from PracSzef r where r.Naz = r.NazSzefa Jeżeli w powyższym zapytaniu podstawilibyśmy na PracSzef tekst z definicji perspektywy znajdujący się po as, to otrzymalibyśmy niepoprawne zapytanie. W systemach relacyjnych podmiana ta następuje na poziomie drzew syntaktycznych zapytania i definicji perspektywy. Należy jeszcze dokonać odpowiedniej transformacji nazw Naz, NazD, NazSzefa występujących w tak przekształconym zapytaniu na nazwy atrybutów z zapamiętanych tabel, a to prowadzi do złożonych i niejasnych semantycznie algorytmów.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Dlaczego w SBQL jest to banalnie proste? Pełna ortogonalność. Pomocnicze nazwy są objęte semantyką języka. Ten sam przykład w SBQL: Jak widać, nazwy wirtualnych kolumn tej perspektywy są standardowymi nazwami powoływanymi przez operator as. Dzięki temu nie ma problemów koncepcyjnych z modyfikacją zapytań. Sprowadza się ona do prostej operacji zastąpienia nazwy PracSzef występującej w zapytaniu przez tekst zapytania znajdującego się po słowie return. procedure PracSzef { return (Prac as p, Dział as d, Prac as s) where (p.PracujeW = d.NrD and d.Szef = s.NrP). (p.Nazwisko as Naz, d.Nazwa as NazD, s.Nazwisko as NazSzefa )}

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Co się dzieje z zapytaniem w SBQL? Zapytanie równoważne podanemu poprzednio zapytaniu SQL ma w SBQL następującą postać: Jeżeli zamiast PracSzef podstawimy tekst zapytania z ciała definicji funkcji PracSzef, to otrzymamy następujące poprawne zapytanie w SBQL: Zapytanie to nie ma już odwołań do funkcji PracSzef. Wynik tego zapytania będzie identyczny z wynikiem oryginalnego zapytania. Zapytanie to może być następnie optymalizowane przy pomocy metod, które będą objaśnione w przyszłym semestrze (i w książce). (PracSzef as r where r.Naz = r.NazSzefa). (r.Naz, r.NazD) (((Prac as p, Dział as d, Prac as s) where (p.PracujeW = d.NrD and d.Szef = s.NrP). (p.Nazwisko as Naz, d.Nazwa as NazD, s.Nazwisko as NazSzefa )) as r where r.Naz = r.NazSzefa). (r.Naz, r.NazD)

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Modyfikacja zapytań dla struktur obiektowych (1) W SBQL mogą być modyfikowane zapytania odwołujące się do dowolnych obiektowych struktur danych. Funkcja MałoZarabiający zwraca bag { struct{ N(i Nazwisko ), Z(i Zar ), D(i Nazwa )}} Dział [0..*] NrD Nazwa Lokacja[1..*] Schemat obiektowy (diagram klas) PracujeW Zatrudnia [1..*] Prac [0..*] NrP Nazwisko Stan Zar Adres [0..1] Miasto Ulica NrDomu Kieruje [0..1] Szef procedure MałoZarabiający { return (Prac where Zar < 0.5 * avg( Prac.Zar ) ). ( Nazwisko as N, Zar as Z, (PracujeW.Dział.Nazwa) as D) };

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Modyfikacja zapytań dla struktur obiektowych (2) Funkcja ta może być użyta w następującym zapytaniu: (MałoZarabiający where N = Bilski).Z Załóżmy, że w bazie danych dostęp poprzez atrybut Nazwisko jest wspomagany indeksem IndeksPracNazwisko( nazw ), który zwraca referencję do obiektów Prac dla stringowego parametru nazw będącego nazwiskiem. Zauważmy następujące okoliczności: Zmaterializowanie wyniku procedury będzie czasochłonne. Indeks IndeksPracNazwisko, zapewniający szybki dostęp do obiektów wg nazwisk, w powyższym zapytaniu nie może być wykorzystany. Zwracanie przez funkcję nazwy działu jest niepotrzebne, bo tej danej zapytanie nie wykorzystuje. Modyfikacja zapytań usuwa te problemy. Dzięki niej nie trzeba będzie liczyć wszystkich elementów tej perspektywy, w szczególności jej niepotrzebnych członów. Można będzie również wykorzystać indeks. Prześledźmy to na kolejnych krokach.

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Po makro-substytucji: (( (Prac where Zar < 0.5 * avg( Prac.Zar )). (Nazwisko as N, Zar as Z, (PracujeW.Dział.Nazwa) as D) ) where N = Bilski). Z Pod-zapytanie (PracujeW.Dział.Nazwa) as D nie jest używane (jest martwe); może być więc usunięte. (( (Prac where Zar < 0.5 * avg( Prac.Zar ) ). (Nazwisko as N, Zar as Z) ) where N = Bilski).Z Rezultat pod-zapytania 0.5 * avg( Prac.Zar ) jest identyczny dla wszystkich pracowników; pod-zapytanie to może być zatem wyciągnięte przed pętlę implikowaną przez pierwszy operator where: (((0.5 * avg(Prac.Zar )) group as x). (Prac where Zar < x ). (Nazwisko as N, Zar as Z) where N = Bilski). Z Kroki modyfikacji i optymalizacji (1)

Języki i środowiska programowania systemów rozproszonych, Wykład 12, Slajd Kroki modyfikacji i optymalizacji (2) Definicje pomocniczych nazw N i Z stają się zbędne; można je usunąć, zastępując oryginalnymi nazwami Nazwisko i Zar: (((0.5 * avg(Prac.Zar )) group as x). (Prac where Zar < x ) where Nazwisko = Bilski). Zar Warunki w dwóch następujące po sobie operatorach where łączymy w jeden warunek połączony operatorem and: ((0.5 * avg(Prac.Zar )) group as x).(Prac where Zar < x and Nazwisko = Bilski). Zar W tej chwili można wykorzystać indeks IndeksPracNazwisko, którego wywołanie zastępuje zapytanie Prac where Nazwisko = Bilski : ((0.5 * avg(Prac.Zar )) group as x). (IndeksPracNazwisko( Bilski ) where Zar < x ). Zar Zapytanie jest ostatecznie zoptymalizowane. Optymalizacja odbywała się na podstawie reguł, które można sformalizować i zaimplementować.