我已经使用以下“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 回答
您的理解通常是正确的 . 内部
rownum <= end
将生成end
行后_24843267_内部查询,外部rownum >= start
将丢弃第一行 .rownum
是动态生成的,并且优化器知道rownum <
过滤器,因此它可以影响行源并将其缩短(在解释计划中查找COUNT STOPKEY
行,'s what you' ll查看它是否有效) .但是无法保证内部选择将被缩短 . 特别是,其中的
order by
子句可能会强制生成整个结果集,然后rownum
过滤器只会丢弃该间隔之外生成的行 .如果查询索引良好且运行良好,为什么不尝试使用物化视图?您可以将rownum定义为列,并根据需要刷新视图 . 也只是一个抬头.. Oracle 12C对分页类型查询提供了极好的支持 .