首页 文章

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

提问于
浏览
0

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

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


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


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

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

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

选择:

  • Page 1(例如0-50)子查询选择0-50行

  • Page 2(例如51-100)子查询选择0-100行(外部查询然后将其限制为50-100)

  • Page 3(例如101-150)子查询选择0-150行(外部查询然后将其限制为101-150)

  • Page 4(例如151-200)子查询选择0-200行(外部查询然后将其限制为151-200)

  • Page 5(例如201-250)子查询选择0-250行(外部查询然后将其限制为201-250)

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

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

提前致谢 . 并反馈赞赏

2 回答

  • 0

    您的理解通常是正确的 . 内部 rownum <= end 将生成 end 行后_24843267_内部查询,外部 rownum >= start 将丢弃第一行 .

    rownum 是动态生成的,并且优化器知道 rownum < 过滤器,因此它可以影响行源并将其缩短(在解释计划中查找 COUNT STOPKEY 行,'s what you' ll查看它是否有效) .

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

  • 1

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

相关问题