0

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

我想确保只要 Oracle 找到第一个匹配项,它就会停止查找。

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

我听说 Oracle 将获取所有符合 column1 和 column2 条件的行,然后只应用 rownum 过滤器来获取第一行,这违背了目的。

4

2 回答 2

4

对查询运行一个解释计划,你会发现你听错了——只要一行被识别为基于查询的其余部分的结果集的一部分,Oracle 就会应用 rownum 谓词。

于 2012-11-27T08:58:16.067 回答
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 的帮助。(不是在这个非常简单的情况下,但它可能有助于重新考虑查询本身。)

于 2012-11-27T08:59:37.397 回答