【问题标题】:How will Oracle optimise a record set if we specify a rownum clause如果我们指定 rownum 子句,Oracle 将如何优化记录集
【发布时间】:2013-07-05 03:49:56
【问题描述】:

如果我说:

select * from table order by col1 where rownum < 100

如果表有 1000 万条记录,Oracle 会带上所有 1000 万条记录,排序然后显示前 10 条吗?还是有办法优化它?

【问题讨论】:

    标签: sql oracle optimization


    【解决方案1】:

    如果你这样做

    select * from table order by col1 where rownum < 100
    

    那么 Oracle 将抛出一个错误,因为 WHERE 子句位于 ORDER BY 之前。

    如果你这样做

    select * from table where rownum < 100 order by col1 
    

    然后 Oracle 将返回随机 99 条记录,因为 WHERE 子句位于 ORDER BY 之前。

    如果您想返回按列排序的前 100 条记录,您必须将排序依据放在子选择中。

    select * 
      from ( select * from table order by col1 )
     where rownum <= 100
    

    Oracle 会进行排序,否则它如何知道您想要的记录?但是,由于 ROWNUM,它将是一个带有停止键的排序。 Oracle 并没有实际上对整个结果集进行排序,因为在后台进行了一些优化,但这是您可以假设的情况。

    请参阅this article by Tom Kyte

    【讨论】:

    • Oracle 12c 的新功能 -- LIMIT 和 OFFSET 子句。
    • 嗯,是的,这会让一些人习惯@David...人们将不得不标记版本!我怀疑它会做同样的事情......只是稍微伪装一下。
    • 他们选择了最新版本的 ANSI 标准,所以它很好、灵活且令人困惑——oracle-base.com/articles/12c/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    相关资源
    最近更新 更多