在评估rownum之前,Oracle是否会获取所有行?

时间:2012-11-27 07:34:59

标签: sql oracle oracle11g rownum

我有一张表有数百万条记录。

我想确保Oracle在找到第一个匹配项时停止查看。

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

我听说Oracle会获取符合column1和column2标准的所有行,然后只应用rownum过滤器来获取第一行,这会破坏目的。

2 个答案:

答案 0 :(得分:4)

对查询运行解释计划,并且您发现您听错了 - 一旦根据查询的其余部分将行标识为结果集的一部分,Oracle将应用rownum谓词

答案 1 :(得分:0)

使用查询提示通常不推荐,除非101%确定没有其他方法可以实现结果(记住关于过早优化的引用非常重要!!!),但为了这个目的,有一个/*+ FIRST_ROWS(<integer>) */提示暗示Oracle优化执行计划以尽快获得第一条记录。

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

推荐阅读:

永远记住:使用提示并不总是正面的,优化器本身就非常聪明......通过应用提示可以使查询慢得多。此外,如果提示现在有效,例如表格增长,将来可能会受到伤害...此外,暗示是黑魔法,所以除非你是DBA,否则你应该试图避开它们,或者至少寻求经验丰富的DBA的帮助。 (不是在这个非常简单的情况下,但它可能只是帮助重新考虑查询本身。)