大数据集的分页

Bre*_*rom 1 sql oracle pagination

我有一个返回大(10000+行)数据集的查询.我想按日期desc订购,并显示前40个结果.有没有办法运行这样的查询,只检索那40个结果而不首先检索所有10000?

我有这样的事情:

select rownum, date, * from table
order by date desc
Run Code Online (Sandbox Code Playgroud)

这将选择所有数据并按日期对其进行排序,但是rownum不按顺序排列,因此仅选择前40个是无用的.

ROW_NUMBER() over (ORDER BY date desc) AS rowNumber
Run Code Online (Sandbox Code Playgroud)

^将按顺序显示rownumber,但我不能在where子句中使用它,因为它是一个窗口函数.我可以运行这个:

select * from (select ROW_NUMBER() over (ORDER BY date desc) AS rowNumber,
 rownum, * from table
order by date desc) where rowNumber between pageStart and pageEnd
Run Code Online (Sandbox Code Playgroud)

但这是选择所有10000行.我怎样才能有效地做到这一点?

Jus*_*ave 5

SELECT *
  FROM (SELECT *
          FROM table
         ORDER BY date DESC)
 WHERE rownum <= 40
Run Code Online (Sandbox Code Playgroud)

将返回排序的前40行date.如果有一个索引date可用于查找这些行,并假设统计信息是最新的,那么Oracle应该选择使用该索引来标识所需的40行,然后针对该表执行40次单行查找检索其余数据./*+ first_rows(40) */如果你想要,你可以在内部查询中添加一个提示但不应该有任何效果.

有关分页查询和前N个查询的更一般性讨论,这里是Tom Kyte的一个很好的讨论更长的AskTom讨论.