Czy po dołączeniu podpowiedzi otrzymujesz różne plany zapytań? Zakładam, że robisz to na podstawie opisu problemu.
Kiedy wykonujesz zapytanie w Oracle, baza danych zazwyczaj nie materializuje całego zestawu wyników w dowolnym momencie (oczywiście może to być konieczne, jeśli określisz ORDER BY
klauzula, która wymaga zmaterializowania wszystkich danych przed sortowaniem). Oracle nie zaczyna faktycznie materializować danych, dopóki klient nie zacznie pobierać danych. Wykonuje wystarczającą ilość zapytania, aby wygenerować dowolną liczbę wierszy, o których pobranie poprosił klient (co w twoim przypadku brzmi 10), zwraca te wyniki do klienta i czeka, aż klient zażąda więcej danych, zanim przejdzie do dalszego przetwarzania zapytanie.
Brzmi to tak, jakby FIRST_ROWS
wskazówka jest uwzględniona, plan zapytania zmienia się w sposób, który powoduje, że jego wykonanie jest droższe. Oczywiście nie to jest celem FIRST_ROWS
wskazówka. Celem jest nakazanie optymalizatorowi wygenerowania planu, który sprawi, że pobieranie pierwszych N wierszy będzie wydajniejsze, nawet jeśli pobranie wszystkich wierszy z zapytania będzie mniej wydajne. Powoduje to, że optymalizator faworyzuje takie rzeczy, jak skanowanie indeksu nad skanowaniem tabel, gdzie skanowanie tabeli może być ogólnie bardziej wydajne. Wygląda na to, że w twoim przypadku szacunki optymalizatora są nieprawidłowe i ostatecznie wybiera plan, który jest po prostu mniej wydajny. To często oznacza, że niektóre statystyki dotyczące niektórych obiektów, do których odnosi się zapytanie, są niekompletne lub nieprawidłowe.