Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> czemu optymalizator nie używa indeksu
tmk
post 3.03.2006, 12:12:36
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 15.04.2004
Skąd: w-wa

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
SongoQ
post 3.03.2006, 16:41:53
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
tmk
post 3.03.2006, 23:57:09
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 15.04.2004
Skąd: w-wa

Ostrzeżenie: (0%)
-----


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..
Go to the top of the page
+Quote Post
Synaps
post 4.03.2006, 02:11:11
Post #4





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 1.12.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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.


--------------------
MySQL said:

You have an error in your SQL syntax near ' `sygnatura` VARCHAR, NOT NULL
Go to the top of the page
+Quote Post
tmk
post 4.03.2006, 09:30:42
Post #5





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 15.04.2004
Skąd: w-wa

Ostrzeżenie: (0%)
-----


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

Ten post edytował tmk 4.03.2006, 10:09:42
Go to the top of the page
+Quote Post
Synaps
post 4.03.2006, 14:11:28
Post #6





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 1.12.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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 ).

Ten post edytował Synaps 6.03.2006, 15:16:31


--------------------
MySQL said:

You have an error in your SQL syntax near ' `sygnatura` VARCHAR, NOT NULL
Go to the top of the page
+Quote Post
tmk
post 11.03.2006, 16:35:38
Post #7





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 15.04.2004
Skąd: w-wa

Ostrzeżenie: (0%)
-----


znalazłęm, że w Oracle 10g jest mechanizm Oracle Text przeznaczony właśnie do wyszukiwania ciągów (rozwiązanie '%coś%')
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:41