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