Does Oracle fetch all the rows before evaluating rownum?

…衆ロ難τιáo~ 提交于 2019-12-02 16:34:59

问题


I have a table that will have millions of records.

I want to make sure Oracle stops looking as long as it finds its first match.

select * from table1
where table1.column1 = 'somevalue' 
  AND table2.column2 = 'somevalue' 
  AND rownum = 1

I heard about that Oracle will fetch ALL the rows that meet the criteria on column1 and column2 and then only apply the rownum filter to get the first row, which defeats the purpose.


回答1:


Run an explain plan on the query, and you'll find that you heard wrong -- Oracle will apply the rownum predicate as soon as a row is identified as part of the result set based on the rest of the query.




回答2:


Using query hints is generally not recommended unless it is 101% sure that there is no other way to achieve the result (it is very important to remember the quote about premature optimization!!!), but for this purpose, there is a /*+ FIRST_ROWS(<integer>) */ hint that hints Oracle to optimize the execution plan for getting the first record as quick as possible.

select * /*+ FIRST_ROWS(1) */ from table1
where table1.column1 = 'somevalue' 
  AND table2.column2 = 'somevalue' 
  AND rownum = 1

Recommended reading:

  • Oracle hints

Always remember: using hints is not always positive, the optimizer is pretty clever by itself... One can make queries much slower by applying hints than without. Also, if a hint works now, for example with the tables growing, it might hurt in the future... Also, hints are black magic, so unless you are a DBA, you should try to steer away from them, or at least seek help from a seasoned DBA. (Not in this quite straightforward case, but it might just help to rethink the query itself.)



来源:https://stackoverflow.com/questions/13579414/does-oracle-fetch-all-the-rows-before-evaluating-rownum

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!