Jednym z najczęstszych problemów optymalizacyjnych ORACLE jest skanowane tzw. full-table scan. Wynika on często z błędnej budowy klauzuli WHERE. Dla przykładu pokaże zapytanie, które spowoduje pełne skanowanie tabel:

WHERE trunc(order_date)  > trunc(order_date - 5)

Ta linijka skutecznie spowolni działanie naszego zapytania.  Dlaczego? Mimo, że kolumna order_date mają założony indeks, to funkcja wbudowana TRUNC ten indeks unieważniają i powodują wielce nieefektywne wykonanie z niepotrzebnymi poleceniami I/O.

Jak to rozwiązać? Są według mnie przynajmniej dwa sposoby:

  1. Naprawić zapytanie poprzez pozostawienie orzecznika klauzuli bez funkcji:
    WHERE order_date >= trunc(order_date - 5) + 1;
  2. Użyć FBI – function based index na orzeczniku:
    CREATE INDEX trunc_order on ORDER(trunc(order_date));

Taki wskaźnik indeksowy na funkcję usuwa zbędne skanowanie po całej tabeli i pozytywnie wpływa na przyspieszenie zapytania.

 

Written by Przemysław Starosta