【问题标题】:Does Oracle fetch all the rows before evaluating rownum?Oracle 在评估 rownum 之前是否获取所有行?
【发布时间】:2012-11-27 07:34:58
【问题描述】:

我有一个包含数百万条记录的表。

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

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

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

【问题讨论】:

  • Oracle SELECT TOP 10 records 的可能重复项
  • @ShivanRaptor ...不,他们没有提到如何不使用 rownum 以使 oracle 仍然扫描整个表而不是在第一次匹配时停止。
  • @shivan 请不要编辑问题以包含指向尽可能重复的链接。目前只有您这么认为,因为没有其他人投票关闭。如果问题被关闭,它将被自动添加。
  • Oracle 将在第一次匹配时停止,除非您在 rownum 过滤器之前进行排序,就像这样 select * from (select * from X order by Y) where rownum =1 使用排序 Oracle 可能必须收集所有行以确定排序以确定哪个是首先。

标签: sql oracle oracle11g rownum


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    推荐阅读:

    永远记住: 使用提示并不总是积极的,优化器本身就非常聪明......使用提示可以使查询速度比不使用提示要慢得多。此外,如果提示现在有效,例如随着表的增长,将来可能会受到伤害......此外,提示是黑魔法,所以除非你是 DBA,否则你应该尽量避开它们,或者至少向经验丰富的 DBA 寻求帮助。 (在这种非常简单的情况下不是这样,但它可能有助于重新考虑查询本身。)

    【讨论】:

    • 我不排除在附加 rownum 谓词时调用 first_rows 。该行为由隐藏参数 _optimizer_rownum_pred_based_fkr 控制,其默认值可能因版本而异。
    • @DavidAldridge 谢谢,我不知道!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多