poniedziałek, 5 grudnia 2011

Podpowiedzi optymalizatora

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