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行.我怎样才能有效地做到这一点?
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讨论.
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |