Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: czemu optymalizator nie używa indeksu
Forum PHP.pl > Forum > Bazy danych > Oracle
tmk
w tabeli prac mam: id_prac, nazwisko, id_zesp. Założyłem index na nazwisko(zwykły index ).
proszę o pomoc , ponieważ:
dla zapytania:
  1. SELECT*
  2. FROM prac
  3. WHERE nazwisko LIKE 'kowal%'

jest wykorzystwany index(table access->by index rowid)
natomiast dla zapytań:
  1. SELECT*
  2. FROM prac
  3. WHERE nazwisko LIKE '%kowal'

oraz
  1. SELECT*
  2. FROM prac
  3. WHERE nazwisko LIKE 'kowal%' OR nazwisko LIKE 'olek%'

optymalizator nie używa indexu

z czego to wynika?
SongoQ
Index to posortowany zbior danych wiec jesli znasz pierwsza litere to algorytmem btree wyszukuje dopasowan i podobnie z kolejnymi literami. Dla LIKE '% tego nie moze uczynic wiec przeszukuje wszyskie wartosci. Jak takie cos przyspieszyc - niestety nie wiem sad.gif
tmk
a jeśli chodzi o to OR ? masz może jakiś pomysł czemu nie korzysta z indeksu w tym przypadku?

z tego co zauważyłem, czasem OR zamienia na UNION ALL i wtedy już korzysta z indeksu..
Synaps
Optymalizator nie skorzysta z indeksu jeśli użyłeś OR z wykorzystaniem pól zawartych w tych indeksie, to jedna z właściowości CBO. Like'i ktorych uzywasz w zapytaniu takze nie pomagaja w poprawnym wykorzystaniu indeksu. Sprobuj dodac wskazowke do optymalizatora /*+ FIRST_ROWS INDEX(nazwa_tabeli nazwa_indeksu) */, sprawdz ja k sie zachowa i postnij tutaj explain plan.
tmk
Synaps: stwierdzenie faktu że nie dziala korzystanie z indeksu nic nie wyjaśnia. Widzę, ze tak jest, bo mam przed sobą explain plan. Ja zadałem pytanie dlaczego smile.gif

Cytat
Dla LIKE '%kowal tego nie moze uczynic wiec przeszukuje wszyskie wartosciJak takie cos przyspieszyc - niestety nie wiem

A może spróbować wymusić odwrócony INDEX? jakoś może:
  1. SELECT/*+ INDEX (prac nazwisko_idx) REVERSE*/*
  2. FROM prac
  3. WHERE nazwisko LIKE '%kowal'

wkońcu po coś są te reverese-indexy smile.gif

jeszcze nie miałem chwili, żeby to sprawdzić, dam znać jaki efekt po południu
Synaps
W przypadku zapytania z OR podejzewam ze indeks nie jest wykorzystany dlatego iz koszt full scana tabeli jest mniejszy niz dwa skany indeksu nawet po rowid. Zapewne też działa tutaj RBO a nie CBO, jak dodasz wskazówke /*+FIRST_ROWS*/ prawdopodobnie opt skorzysta z indeksu, ale kosz wykonania będzie wiekszy niż bez niego.( zakładam też że masz wygenerowane statystki dla tabeli oraz indeksu) Oczywiście to tylko przypuszczenia bo nie wkleiłeś żadnego explain planu.



btw: co do mojego stwierdzenia dot. OR w poscie powyżej to moja pomyłka, wydawało mi się że jako drugi warunek daleś '%wartosc' co nie pozwala korzystac z indeksu ze wzgledu na niemozliwosc okreslenia przedzialu poszukiwania ( dokladnie poczatku ).
tmk
znalazłęm, że w Oracle 10g jest mechanizm Oracle Text przeznaczony właśnie do wyszukiwania ciągów (rozwiązanie '%coś%')
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.