包含在分页选择语句和ROWNUM中的子查询的行为

时间:2013-03-13 16:44:41

标签: oracle pagination rownum

我使用了以下“wapper”在几个场合实现分页,并经常将其称为“标准分页选择”。 因此,要对任何select语句的结果进行分页,只需将select语句包装在“标准分页选择”中。

    SELECT * FROM (SELECT a.*, ROWNUM rnum FROM ((


    ( subquery:  put your select * from .......  here ..)


)) a WHERE ROWNUM  <=  ${resultEnd} ) 
WHERE rnum  >=  ${resultStart}

我的问题是关于寻呼位的行为和ROWNUM周围的魔力。根据我的理解,子查询 每次都选择完整的结果集,并且 寻找确认还是其他?

以下是上面显示的分页行为的正确描述,例如,如果页面大小为50:

选择:

  • 第1页(例如0-50)子查询选择0-50行
  • 第2页(例如51-100)子查询选择0-100行(外部查询然后将其限制为50-100)
  • 第3页(例如101-150)子查询选择0-150行(外部查询将其限制为101-150)
  • 第4页(例如151-200)子查询选择0-200行(外部查询然后将其限制为151-200)
  • 第5页(例如201-250)子查询选择0-250行(外部查询然后将其限制为201-250)

......等等,你可以看到模式。

进入“页面”越远,子查询必须做的工作就越多。它是否正确?如果是这样,ROWNUM如何做到这一点?

提前致谢。并反馈赞赏

2 个答案:

答案 0 :(得分:1)

您的理解通常是正确的。内部rownum <= end将在生成end行后“中断”内部查询,而外部rownum >= start会丢弃第一行。

动态生成

rownum,优化器知道rownum <个过滤器,因此它可以影响行源并将其缩短(在解释计划中查找COUNT STOPKEY行,如果它有效,那就是你会看到的。)

但无法保证内部选择将被缩短。特别是,其中的order by子句可能会强制生成整个结果集,然后rownum过滤器只会丢弃该时间间隔之外生成的行。

答案 1 :(得分:0)

如果查询编入索引且运行良好,为什么不尝试使用物化视图? 您可以将rownum定义为列,并根据需要刷新视图。 另外还有一个问题.Oracle 12C对分页类型查询提供了极好的支持。