Oracle
 sql >> база данни >  >> RDS >> Oracle

ResultSet.next много бавен само когато заявката съдържа FIRST_ROWS или ROWNUM ограничение

Получавате ли различни планове за заявка, когато включите подсказката? Моето предположение е, че го правите въз основа на вашето описание на проблема.

Когато изпълнявате заявка в Oracle, базата данни обикновено не материализира целия набор от резултати във всеки момент (очевидно може да се наложи, ако посочите ORDER BY клауза, която изисква всички данни да бъдат материализирани преди сортирането да се случи). Oracle всъщност не започва да материализира данни, докато клиентът не започне да извлича данни. Той изпълнява достатъчно от заявката, за да генерира толкова много редове, които клиентът е поискал да извлече (което звучи като 10 във вашия случай), връща тези резултати на клиента и чака клиентът да поиска повече данни, преди да продължи да обработва заявка.

Звучи като когато FIRST_ROWS подсказката е включена, планът на заявката се променя по начин, който го прави по-скъп за изпълнение. Очевидно това не е целта на FIRST_ROWS намек. Целта е да се каже на оптимизатора да генерира план, който прави извличането на първите N реда по-ефективно, дори ако прави извличането на всички редове от заявката по-малко ефективно. Това води до това, че оптимизаторът предпочита неща като сканиране на индекси пред сканиране на таблици, където сканирането на таблица може да бъде по-ефективно като цяло. Изглежда, че във вашия случай обаче оценките на оптимизатора са неправилни и в крайна сметка той избира план, който като цяло е по-малко ефективен. Това често означава, че някои от статистическите данни за някои от обектите, към които се отнася вашата заявка, са непълни или неправилни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Премахнете всички знаци след конкретен знак в PL/SQL

  2. Игнорирайте параметъра за период от време в клаузата where, когато параметърът не е въведен

  3. Oracle изберете най-новия запис за дата

  4. Oracle - какво се случва с транзакцията в случай на загуба на ORA-03135 връзка?

  5. DateTime on Where Clause Oracle