Oracle的ROWNUM是否在提取所需的行之前构建整个表?

时间:2011-12-20 17:20:36

标签: oracle rownum

我需要制作一个导航面板,仅显示可能的大结果集的子集。此子集之前是20个记录,结果记录集之后是20个记录。当我通过导航面板导航结果时,我将使用ROWNUM应用滑动窗口设计来获取下一个子集。我的问题是Oracle的ROWNUM在提取你想要的行之前是否构建了整个表?或者它是否足够智能,只能生成我需要的行?我用谷歌搜索,我无法找到解释。

5 个答案:

答案 0 :(得分:2)

您的解决方案无效(正如Bob正确指出的那样),但您可以使用row_number()做您想做的事情:

SELECT col1, 
       col2
FROM ( 
   SELECT col1, 
          col2, 
          row_number() over (order by some_column) as rn
   FROM your_table
) t
WHERE rn BETWEEN 10 AND 20

请注意,此解决方案具有额外的好处,您可以根据需要在不同的条件下订购最终结果。

编辑:忘记回答您的初步问题:

通过上述解决方案,是的Oracle必须构建完整的结果才能找到正确的编号。

使用11g及以上版本,您可以使用query cache改进查询。

答案 1 :(得分:2)

执行此操作的预分析函数方法是:

select col1, col2 from (
    select col1, col2, rownum rn from (
        select col1, col2 from the_table order by sort_column
      )
      where rownum <= 20
  )
  where rn > 10

在这种情况下,Oracle优化器将识别它只需要获得前20行以满足内部查询。它可能必须查看所有行(除非,例如,排序列的索引方式允许它完全避免排序)但它不需要对所有行进行完整排序。

答案 2 :(得分:2)

关于问题的标题。

请参阅http://www.orafaq.com/wiki/ROWNUMthis Tom Kyte的深入解释。

关于问题的目标。

这应该是您正在寻找的内容:Paging with Oracle

答案 3 :(得分:0)

我认为你的设计不会按照你的计划完成。 Oracle按照查询生成的顺序将值分配给ROWNUM - 生成的第一行分配ROWNUM = 1,第二行分配ROWNUM = 2等。请注意,为了分配ROWNUM = 21,查询必须首先返回前20行,因此如果你写了一个说

的查询
SELECT *
  FROM MY_TABLE
  WHERE ROWNUM >= 21 AND
        ROWNUM <= 40

不会返回任何行,因为为了存在ROWNUM&gt; = 21的行,查询必须首先返回ROWNUM&lt; = 20的所有行。

我希望这会有所帮助。

答案 4 :(得分:0)

这是一个老问题,但你应该试试这个 - http://www.inf.unideb.hu/~gabora/pagination/results.html