Oracle 包装在分页select语句和ROWNUM中的子查询行为

Oracle 包装在分页select语句和ROWNUM中的子查询行为,oracle,pagination,rownum,Oracle,Pagination,Rownum,我曾使用以下wapper在一些情况下实现分页,并经常将其称为标准分页选择。 因此,要对任何select语句的结果进行分页,只需将select语句包装在标准分页select中 SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (( ( subquery: put your select * from ....... here ..) )) a WHERE ROWNUM <= ${resultEnd} ) WHERE rn

我曾使用以下wapper在一些情况下实现分页,并经常将其称为标准分页选择。 因此,要对任何select语句的结果进行分页,只需将select语句包装在标准分页select中

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


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


)) a WHERE ROWNUM  <=  ${resultEnd} ) 
WHERE rnum  >=  ${resultStart}
我的问题是关于分页位的行为和ROWNUM的魔力。据我所知,子查询并不是每次都选择完整的结果集,而是 是否在寻求确认

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

选择:

第1eg页0-50子查询选择0-50行 第2eg 51-100页子查询选择0-100行,然后将其限制为50-100行 第3eg 101-150页子查询选择0-150行,然后将其限制为101-150行 第4eg页151-200子查询选择0-200行,然后将其限制为151-200行 第5eg 201-250页子查询选择0-250行,然后将其限制为201-250行 。。。以此类推,你可以看到模式

进入页面越深,子查询需要做的工作就越多。这是正确的吗?如果是这样,ROWNUM如何做到这一点


提前谢谢。并反馈感谢

您的理解大体上是正确的。内部rownum=start将丢弃第一行


rownum是动态生成的,优化器知道rownum如果查询索引良好并且执行良好,为什么不尝试使用物化视图呢? 您可以将rownum定义为列,并根据需要刷新视图。 也只是一个提醒。。Oracle 12C提供了对分页类型查询的出色支持。

好的tom kyte文章: