piątek, 27 września 2013

Oracle Outlines

Outlines


Outlines zostały wprowadzone aby zagwarantować stały plan wykonania, bez względu na zmiany w środowisku uruchomieniowym, czy zmiany statystyk. Stają się bardzo użyteczne gdy zechcemy wykonać zapytanie na innym serwerze w dokładnie taki sam sposób jak na pierwotnym, w przypadku upgrade wersji Oracle czy migracji z optymalizatora regułowego do kosztowego.
Outlines są obiektami powiązanymi z zapytaniami, zbiorami hintów optymalizatora kosztowego które są w stanie zmusić go do wykonania zapytania w określony sposób, definiując w sposób jednoznaczny plan zapytania. W pewnym sensie „zamrażają” plan wykonania zapytania.

Dzięki Outlines jesteśmy w stanie wpływać na pracę optymalizatora kosztowego i wybór planu, bez konieczności modyfikacji kodu zapytania. Hinty przechowywane są w słownikach systemowych, są powiązane z konkretnym zapytaniem i optymalizator kosztowy wybiera je automatycznie. Jest to bardzo przydatne w przypadku konieczności optymalizacji aplikacji której kodu źródłowego nie jesteśmy w stanie zmienić. W czasie działania optymalizator kosztowy poddaje treść zapytania normalizacji (tj. np. powiększa wszystkie znaki w wyrażeniach składniowych) i poszukuje w słownikach outlines dla takiego właśnie zapytania. Jeśli znajduje, stosuje je do wygenerowania planu zapytania. Outlines są dostępne od wersji 10g wzwyż, we wszystkich licencjach włącznie z Express Edition.

Tworzenie Outlines


Tworzyć outlines można na dwa sposoby: manualnie, bądź zlecić systemowi automatyczne
generowanie outlines dla wszystkich zapytań z sesji, bądź całej bazy.

Automatyczne generowanie outlines


Automatyczne generowanie outlines możemy uruchomić ustawiając parametr create_stored_outlines na True. Parametr ten można ustawić dla sesji, lub całego systemu. Outlines będą wtedy tworzone odpowiednio dla wszystkich zapytań z sesji, lub dla wszystkich zapytań uruchamianych w ramach instancji.

Uruchamianie automatycznego generowania Outlines w ramach sesji:

ALTER SESSION SET CREATE_STORED_OUTLINES=TRUE;

Wyłączanie automatycznego generowania Outlines w ramach sesji:

ALTER SESSION SET CREATE_STORED_OUTLINES=FALSE;

Uruchamianie automatycznego generowania Outlines w ramach całej instancji (oczywiście potrzebne są do tego uprawnienia):

ALTER SYSTEM SET CREATE_STORED_OUTLINES=TRUE;

Wyłączanie automatycznego generowania Outlines w ramach instancji:

ALTER SYSTEM SET CREATE_STORED_OUTLINES=FALSE;

Manualne generowanie Outlines

Outlines możemy tworzyć również manualnie, dla wybranego zapytania. Jeśli zechcemy robić to jako jakiś inny niż SYS bądź SYSTEM użytkownik, będziemy potrzebowali stosownych uprawnień:



GRANT CREATE ANY OUTLINE TO NAZWA_UZYTKOWNIKA;



Outline dla zapytania tworzymy w taki sposób:



CREATE OUTLINE JOIN_EMP_DEP_ORDER ON
SELECT * FROM EMPLOYEES JOIN DEPARTMENTS
USING(DEPARTMENT_ID) ORDER BY DEPARTMENT_NAME,LAST_NAME;

Przeglądać nasze stworzone outlines możemy w słowniku USER_OUTLINES :







Same hinty powiązane za danym Outline znajdziemy w słowniku USER_OUTLINES_HINTS:





Administrator ma do dyspozycji dwa słowniki DBA_OUTLINES i DBA_OUTLINE_HINTS, w których może przeglądać Outlines i związane z nimi hinty wszystkich użytkowników:






Używanie Outlines


Same outlines mamy już stworzone, jednak nie zostały do tej pory użyte i do czasu aż nie ustawimy parametru QUERY_REWRITE_ENABLED nie będą używane. To czy dany Outline został użyty czy też nie, możemy stwierdzić sprawdzając wartość w kolumnie USED słownika USER_OUTLINES :



Wydaję więc polecenie :




ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;




Możemy też uruchomić tą opcję dla całego systemu:




ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;



Musimy jednak dysponować uprawnieniami do zmiany parametrów systemowych.






Outlines są zbierane w grupy, które możemy zdefiniować podczas tworzenia danego zarysu. Jeśli nie zdefiniujemy grupy (kategorii) do której nasz outline ma należeć, zostanie on przypisany do grupy DEFAULT. Niemniej musimy podać systemowi informację, z której grupy ma korzystać:




ALTER SESSION SET USE_STORED_OUTLINES=DEFAULT;




Jeśli tego nie zrobimy, system nie będzie wykorzystywał naszych outlines!




Testy

W dalszej kolejności uruchamiam zapytanie dla którego został stworzony Outline :





Po tej czynności sprawdzam jeszcze wpis w słowniku USER_OUTLINES. Wartość w kolumnie USED dla naszego Outline, powinna zmienić się z UNUSED na USED.





Jeśli tak się nie stało, to mogą być tego trzy przyczyny:
  • nie włączyliśmy parametru QUERY_REWRITE_ENABLED
  • nie ustawiliśmy kategorii używanych Outlines poprzez parametr USE_STORED_OUTLINES
  • Nasze zapytanie czymś się jednak różni od tego, dla którego Outline został stworzony.



Odbudowywanie Outlines

Jeśli zmienią się struktury dostępu, np. zostaną dodane nowe indeksy, warto odtworzyć Outline'y i w ten sposób odświeżyć związane z nimi hinty. W tym celu stosujemy polecenie:



ALTER OUTLINE NAZWA_OUTLINE REBUILD;


Włączanie i wyłączanie wybranych Outlines




Jeśli zechcemy jakiś Outline tymczasowo wyłączyć, nie kasując go trwale wydajemy poniższe polecenie:



ALTER OUTLINE NAZWA_OUTLINE DISABLE;



Później zawsze możemy go włączyć do użycia:



ALTER OUTLINE NAZWA_OUTLINE ENABLE;



Eksport i import Outlines

Niestety Oracle nie dostarcza żadnego narzędzia do przenoszenia między serwerami ani eksportu i importu outlines. Musimy więc sobie poradzić jakoś inaczej. Posłużymy się programami imp oraz exp, dostępnymi we wszystkich licencjach Oracle. Wszystkie outlines znajdują się w słownikach schematu OUTLN. Eksportuje więc ten schemat do pliku:



Muszę teraz zaimportować ten schemat na serwerze na który chcę wdrożyć stworzone wcześniej Outlines.
 






Po operacji importu, musimy po stronie serwera na którym wdrażamy nasze outlines uruchomić ich używanie – tak jak robiliśmy to na serwerze źródłowym:



ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;
ALTER SYSTEM SET USE_STORED_OUTLINES=DEFAULT;



lub tylko w ramach sesji:



ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;
ALTER SESSION SET USE_STORED_OUTLINES=DEFAULT;




Od tej pory outlines będą wykorzystywane tak jak na serwerze źródłowym. Warto sprawdzić jako administrator zawartość słowników DBA_OUTLINES , DBA_OUTLINE_HINTS czy na pewno wszystko się przeniosło właściwie.

Brak komentarzy:

Prześlij komentarz