我使用了以下“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:
选择:
......等等,你可以看到模式。
进入“页面”越远,子查询必须做的工作就越多。它是否正确?如果是这样,ROWNUM如何做到这一点?
提前致谢。并反馈赞赏
答案 0 :(得分:1)
您的理解通常是正确的。内部rownum <= end
将在生成end
行后“中断”内部查询,而外部rownum >= start
会丢弃第一行。
rownum
,优化器知道rownum <
个过滤器,因此它可以影响行源并将其缩短(在解释计划中查找COUNT STOPKEY
行,如果它有效,那就是你会看到的。)
但无法保证内部选择将被缩短。特别是,其中的order by
子句可能会强制生成整个结果集,然后rownum
过滤器只会丢弃该时间间隔之外生成的行。
答案 1 :(得分:0)
如果查询编入索引且运行良好,为什么不尝试使用物化视图? 您可以将rownum定义为列,并根据需要刷新视图。 另外还有一个问题.Oracle 12C对分页类型查询提供了极好的支持。