Podpowiedzi optymalizatora
Podpowiedzi optymalizatora stosuje się kiedy chcemy wpłynąć na sposób działania optymalizatora kosztowego. Możemy mu np. kazać skorzystać z indeksu, lub tego zabronić. Możemy nakazać mu wykorzystanie określonego algorytmu łączenia tabel, a także wpływać na wiele innych procesów.
Generalnie podpowiedzi (hintów) używa się w ostatniej kolejności w procesie optymalizacji i tylko wtedy gdy optymalizator kosztowy ewidentnie się myli, albo mamy do czynienia z sytuacjami o których optymalizator kosztowy nie wie (np. czas wykonania zapytania dla algorytmu o teoretycznie wyższym koszcie jest krótszy).
Podpowiedzi powinny następować zaraz po klauzuli SELECT i mają konstrukcję następującą:
SELECT /*+ podpowiedź */ LAST_NAME, FIRST_NAME FROM EMPLOYEES;
Podpowiedź musi się znaleźć pomiędzy /*+ a */ i następować zaraz po SELECT. Jeśli popełnimy błąd (np. literówka) podpowiedź zostanie zignorowana i potraktowana jako komentarz. Nie możemy wymusić hintem czynności niemożliwych, takich jak np. zastosowanie indeksu który założony jest na kolumnę innej tabeli niż ta do której sięgamy.
INDEX
SELECT /*+ index(e nazwaindeksu)*/ nazwakolumny from nazwatabeli e;
Wymusi zastosowanie indeksu do pobierania wartości z kolumny (np. zamiast Full scana po tabeli).
NO_INDEX
SELECT /*+ no_index(e nazwaindeksu)*/ nazwakolumny from nazwatabeli e;
Zabroni wykorzystania indeksu do pobrania wartości z kolumny.
ALL_ROWS
Select /*+ALL_ROWS*/ Employee_Id From Employees e;
Wymusi stosowanie takich algorytmów by optymalizacja była nastawiona na efektywny zwrot wszystkich wierszy.
FIRST_ROWS
Select /*+FIRST_ROWS(n)*/ Employee_Id From Employees e;
Wymusi stosowanie takich algorytmów by optymalizacja była nastawiona na efektywny zwrot pierwszych „n” wierszy.
FULL
Select /*+FULL(e)*/ employee_id from employees;
Wymusi wykorzystanie pełnego skanu po tabeli przy pobieraniu danych.
USE_NL
Select /*+use_nl(e d)*/ * From Employees e join departments d using(department_id);
Wymusi wykorzystanie algorytmu nested loops (pętle zagdzieżdżone) do łączenia tabel.
NO_USE_NL
Select /*+no_use_nl(e d)*/ * From Employees e join departments d using(department_id);
Zabroni wykorzystania algorytmu nested loops (pętle zagdzieżdżone) do łączenia tabel.
USE_MERGE
Select /*+use_merge(e d)*/ * From Employees e join departments d using(department_id);
Wymusi wykorzystanie algorytmu sort merge join podczas łączenia tabel.
NO_USE_MERGE
Select /*+no_use_merge(e d)*/ * From Employees e join departments d using(department_id);
Zabroni wykorzystania algorytmu sort merge join podczas łączenia tabel.
USE_HASH
Select /*+use_hash(e d)*/ * From Employees e join departments d using(department_id);
Wymusi wykorzystanie algorytmu hashującego do łączenia tabel.
NO_USE_HASH
Select /*+no_use_hash(e d)*/ * From Employees e join departments d using(department_id);
Zabroni wykorzystania algorytmu hashującego do łączenia tabel.
CURSOR_SHARING_EXACT
Select /*+cursor_sharing_exact*/ * from employees where employee_Id=:x
Wymusi potraktowanie zmiennych bindowanych w zapytaniu tak jakbyśmy mięli włączony parametr CURSOR_SHARING na EXACT w sytuacji kiedy mamy ustawiony inaczej niż domyślnie.
Podpowiedzi optymalizatora jest znacznie więcej. Tutaj przedstawiłem najczęściej używane.
Brak komentarzy:
Prześlij komentarz