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 周围的魔法。据我了解,子查询不会每次都选择完整的结果集,而是在寻找确认或其他方式?

以下是对上面显示的分页行为的正确描述,例如,如果页面大小为 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 如何做到这一点?

提前致谢。并反馈赞赏

4

2 回答 2

1

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

rownum动态生成,优化器知道rownum <过滤器,因此它可以影响行源并停止它(COUNT STOPKEY在解释计划中查找行,如果它有效,你会看到)。

但是不能保证内部选择会停止。特别是,其中的一个order by子句可能会强制生成整个结果集,然后rownum过滤器会简单地丢弃该间隔之外的生成行。

于 2013-03-13T16:50:59.797 回答
0

If the query is well indexed and performs well, why not try using a materialized view? You can define rownum as a column and refresh the view on demand. Also just a heads up.. Oracle 12C is coming with an excellent support for pagination type query.

于 2013-03-13T18:25:23.800 回答