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 :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