我有一张表有数百万条记录。
我想确保Oracle在找到第一个匹配项时停止查看。
select * from table1
where table1.column1 = 'somevalue'
AND table2.column2 = 'somevalue'
AND rownum = 1
我听说Oracle会获取符合column1和column2标准的所有行,然后只应用rownum过滤器来获取第一行,这会破坏目的。
答案 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的帮助。 (不是在这个非常简单的情况下,但它可能只是帮助重新考虑查询本身。)