Получавате ли различни планове за заявка, когато включите подсказката? Моето предположение е, че го правите въз основа на вашето описание на проблема.
Когато изпълнявате заявка в Oracle, базата данни обикновено не материализира целия набор от резултати във всеки момент (очевидно може да се наложи, ако посочите ORDER BY
клауза, която изисква всички данни да бъдат материализирани преди сортирането да се случи). Oracle всъщност не започва да материализира данни, докато клиентът не започне да извлича данни. Той изпълнява достатъчно от заявката, за да генерира толкова много редове, които клиентът е поискал да извлече (което звучи като 10 във вашия случай), връща тези резултати на клиента и чака клиентът да поиска повече данни, преди да продължи да обработва заявка.
Звучи като когато FIRST_ROWS
подсказката е включена, планът на заявката се променя по начин, който го прави по-скъп за изпълнение. Очевидно това не е целта на FIRST_ROWS
намек. Целта е да се каже на оптимизатора да генерира план, който прави извличането на първите N реда по-ефективно, дори ако прави извличането на всички редове от заявката по-малко ефективно. Това води до това, че оптимизаторът предпочита неща като сканиране на индекси пред сканиране на таблици, където сканирането на таблица може да бъде по-ефективно като цяло. Изглежда, че във вашия случай обаче оценките на оптимизатора са неправилни и в крайна сметка той избира план, който като цяло е по-малко ефективен. Това често означава, че някои от статистическите данни за някои от обектите, към които се отнася вашата заявка, са непълни или неправилни.