• Nie Znaleziono Wyników

Rozdział 2. Algebra przetwarzania strumieniowego

2.10 Optymalizacja zapytania w oparciu o monotoniczność strumieni

W relacyjnych bazach danych zbiór danych, na których są realizowane operacje jest znany. W strumieniowych bazach danych nie znamy całego zbioru danych w chwili uruchomienia zapytania. Sprawia to, że statystyki opisujące zapytani są obarczone większym błędem. W przeciwieństwie do statystyk, niezmienniki gwarantują występowanie pewnych własności dla wszystkich krotek strumienia. Wyróżniamy dwa sposoby użycia monotoniczności w optymalizacji.

Pierwsza podejście jest skoncentrowane na pojedynczych operatorach. Znajomość typu monotoniczności pozwala przeprowadzić optymalizację operatorów stanowych, która jest niezależna od dynamicznie zmieniających się parametrów takich jak intensywność i selektywność. Przedmiotem optymalizacji jest tutaj algorytm przekształcający strumień w tabelę historii. Jeżeli strumień jest najsłabiej nie monotoniczny, wówczas kolejność krotek względem początku czasu życia odpowiada kolejności ich wygasania. Należy wtedy przechowywać krotki w kolejce FIFO, aby przyspieszyć proces wymiatania z tabeli historii krotki wygasłe. Implementacja wymiatania sprowadza się do przeglądania elementów listy, zgodnie z porządkiem zapisu. Jeżeli strumień zasilający jest słabo monotoniczny, wtedy o strumieniu wiemy tylko, że nie zawiera krotek negatywnych. Wydajna realizacja tabeli historii wymaga wówczas zbudowania kolejki priorytetowej zawierającej krotki uporządkowane względem czasu wygasania. Dzięki niej sprawdzane są tylko kolejne elementy kolejki do momentu napotkania krotki ze znacznikiem te większym od zadanego. Jeżeli strumień zasilający jest mocno nie monotoniczny, wtedy w strumieniu dodatkowo mogą pojawiać się krotki negatywne. Do ich obsługi konieczne jest utworzenie struktury indeksującej ze względu na klucz główny. Należy dodatkowo wprowadzić optymalizację zaproponowaną dla strumieni typu słabo nie monotonicznych, ponieważ strumień zawiera krotki temporalne oraz kolejności ich uporządkowania względem znaczników ts i te są różne,. Konkludując, czym strumień jest słabiej monotoniczny tym bardziej złożona jest jego obsługa.

Drugi obszar zastosowania monotoniczności polega na przekształceniu zapytania strumieniowego tak, aby zawierało najwięcej operatorów przetwarzających strumienie o najmniejszym stopniu nie monotoniczności.

Zbudowany system jest oparty na operatorach logicznych, dlatego potrafimy zdefiniować przekształcenia tożsamościowe. Dodatkowo przy opisie każdego z operatorów, przeanalizowano jego typ monotoniczności, jako funkcja typów monotoniczności strumieni zasilających. Powyższe dwa elementy pozwalają na skonstruowanie prostego optymalizatora regułowego, który poprzez przestawienie operatorów w planie produkcji redukuje liczbę strumieni o wysokim stopniu nie monotoniczności.

Skonstruowany optymalizator pobiera wstępny plan produkcji zapytania opisany przy użyciu DAG, a jako wynik zwraca jego poprawioną wersję. Działanie optymalizatora opisuje alg. 2.6. Jego parametrami wejściowymi są zapytanie dag oraz lista reguł reduceRules. Reguła optymalizatora jest obiektem składającym się z dwóch metod. Pierwszą jest check(op, dag), która sprawdza czy dla badanego operatora op zachodzi aktywacja reguły. Drugą jest reduce(op, dag, ops), która modyfikuje plan produkcji. Jej argumentami są analizowany operator op, zapytanie

dag i lista operatorów ops pozostałych do przetworzenia. Cykl optymalizatora polega

na pobraniu z listy reduceRules kolejnej reguły. Następnie, jest ona wywoływana dla każdego operatora należącego do planu dag, do momentu gdy wszystkie operatory ją aktywujące zostaną przekształcone. Na koniec cyklu z listy reduceRules pobierana jest kolejna reguła.

Do skonstruowania listy reguł skorzystano z następujących własności:

1) Kolejność realizacji operatorów bezstanowych i okien czasowych w planie produkcji nie zmienia wyniku zapytania, jeżeli operatory bezstanowe nie korzystają z wartości znacznika te [56]:

qrY8¸-Z = 8¸¹qr-º qr¹b r-º = b r¹qr-º

Obie własności pozwalają przenieść operator selekcji na początek planu produkcji, co odciąża operatory okna lub mapy przed obsługą krotek, które później zostaną odfiltrowana. Zbiór operatorów okien jest zawężony do okien czasowych, ponieważ okna fizyczne zliczają liczbę wystąpień krotek, w konsekwencji przestawienie kolejności realizacji tego operatora z operatorem selekcji prowadzi do zmiany wyniku.

2) Łączność produktu kartezjańskiego:

-× -] × -»= -× -]× -»

Własność ta pozwala na zmianę kolejności realizacji operatorów produktu kartezjańskiego, aby na końcu obsługiwać strumienie z wysokim stopniem niemonotoniczności wymagające stosowania złożonych struktur danych. 3) Umieszczenie selekcji na strumieniu zasilającym produkt kartezjański

albo przeniesienie go na wyjście produktu kartezjańskiego nie prowadzi do zmiany zawartości strumienia wynikowego.

4) Operator Θ złączenia jest złożeniem operatora produktu kartezjańskiego i selekcji zdefiniowanej na atrybutach należących do obu strumieni zasilających produkt kartezjański.

×v-, -] = qr-× -]

Algorytm 2.6. Algorytm optymalizatora regułowego.

Optimize(DAG dag, List reduceRules) 1) for(Rule r: reduceRules){

2) boolean reduce = true;

3) while(reduce){

4) ops = stwórz listę operatorów dla DAG;

5) reduce = false;

6) while(!ops.isEmpty()){

7) Operator op = ops.removeFirst();

8) if(r.check(op, DAG)){

9) r.reduce(op, DAG, ops);

10) reduce = true;

11) }

12) }

13) }

14) }

Przyjęto założenie, że zapytanie wejściowe posiada operator Θ złączenia zdekomponowany na operator produktu kartezjańskiego oraz operator selekcji. Pozwala to swobodnie przemieszczać operator produktu kartezjańskiego w trakcie optymalizacji. Dopiero, gdy przeprowadzona zostanie analiza monotoniczności, operator produktu kartezjańskiego oraz wybrane predykaty są zastępowane operatorami Θ złączenia. Wymienione własności zapytania strumieniowego użyto do skonstruowania następującej listy reguł:

1) Reguła przeniesienia operatora produktu kartezjańskiego na początek planu produkcji. Warunek aktywacji reguły zachodzi, gdy jeden ze strumieni

wejściowych jest generowany przez operator selekcji oraz operator ten zasila tylko operator produktu kartezjańskiego. W wyniku uruchomienia reguły, operator selekcji jest przeniesiony na wyjście operatora produktu kartezjańskiego.

2) Reguła przeniesienia operatora produktu kartezjańskiego mocno nie monotonicznego na koniec planu produkcji. Warunek aktywacji zachodzi, jeżeli operator kartezjański op1 ma jeden strumień wejściowy co najwyżej słabo monotoniczny, a drugi mocno niemonotoniczny. Dodatkowo strumień ten jest zasilany przez operator kartezjański op2, którego jeden strumień wejściowy jest również co najwyżej słabo monotoniczny, a drugi mocno niemonotoniczny. Reguła ta korzystając z własności łączności produktu kartezjańskiego, przenosi produkt kartezjański op2 na koniec planu produkcji, tak że tylko jeden operator przetwarza strumień mocno nie monotoniczny.

3) Reguła wczesnego wyznaczania selekcji. Warunek aktywacji zachodzi, jeżeli operator selekcji jest poprzedzony operatorem mapy albo oknem czasowym. Dodatkowo, gdy operator selekcji jest poprzedzony operatorem produktu kartezjańskiego oraz warunek predykatu jest zbudowany tylko na atrybutach jednego ze strumieni zasilających. W wyniku uruchomienia reguły operator selekcji jest zastępowany miejscem z operatorem poprzedzającym. Kiedy operatorem poprzedzającym jest operator produktu kartezjańskiego, operator selekcji jest umieszczany na wejściu, do którego dołączony był strumień zawierający operandy predykatu.

4) Reguła tworzenia operatora Θ złączenia. Warunek aktywacji zachodzi, jeżeli operator selekcji jest poprzedzony operatorem produktu kartezjańskiego i predykat selekcji jest zbudowany na obu strumieniach zasilających. W wyniku uruchomienia reguły powstaje operator Θ złączenia.

Analizując działanie optymalizatora, po przetworzeniu pierwszej i drugiej reguły operatory produktu kartezjańskiego są względem siebie tak ułożone, aby zminimalizować liczbę strumieni mocno nie monotonicznych. Reguła trzecia przenosi operatory selekcji na pozycje leżące najbliżej źródeł danych. Po jej realizacji każdy operator produktu kartezjańskiego ma po sobie szereg operatorów selekcji, przy czym pierwszy z nich zostanie wybrany do skonstruowania operatora Θ złączenia. Finalnie reguła czwarta definiuje operator Θ złączenia.

Przedstawione algorytmy ilustrują jak można użyć monotoniczność do optymalizacji pojedynczych operatorów, jak i grafu ich połączeń. Element które je wyróżnia to brak podatności na zmieniające się parametry dynamiczne strumieni. O ile optymalizacja bazująca na statystykach zawiera czynnik losowy, o tyle optymalizacja oparta na monotoniczności jest stabilna. Chcąc rozbudować moduł optymalizacji zapytań strumieniowych należałoby dodatkowo dołączyć indeks dla szeregu następujących po sobie operatorów selekcji, jak również wybór predykatu dla operatora Θ złączenia oprzeć na analizie złożoności obliczeniowej i selektywności operatorów selekcji następujących po operatorze produktu kartezjańskiego.