【问题标题】:Pagination of large dataset大型数据集的分页
【发布时间】:2015-09-28 09:12:01
【问题描述】:

我有一个返回大型(10000 多行)数据集的查询。我想按日期顺序排序,并显示前 40 个结果。有没有办法运行这样的查询,只检索这 40 个结果而不首先检索所有 10000 个结果?

我有这样的事情:

select rownum, date, * from table
order by date desc

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

ROW_NUMBER() over (ORDER BY date desc) AS 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

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

【问题讨论】:

  • 你使用的是哪个数据库?
  • rowNumber的值在pageStart和pageEnd之间吗?

标签: sql oracle pagination


【解决方案1】:
SELECT *
  FROM (SELECT *
          FROM table
         ORDER BY date DESC)
 WHERE rownum <= 40

将返回按date 排序的前 40 行。如果date 上有一个可用于查找这些行的索引,并且假设统计信息是最新的,Oracle 应该选择使用该索引来识别您想要的 40 行,然后针对其执行 40 次单行查找表以检索其余数据。如果你愿意的话,你可以在内部查询中抛出一个/*+ first_rows(40) */ 提示,但这不应该有任何影响。

关于分页查询和前 N 个查询的更一般性讨论,这里有一个很好的 discussion from Tom Kyte 和一个 much longer AskTom discussion

【讨论】:

    【解决方案2】:

    您不需要窗口函数。见

    http://www.techonthenet.com/oracle/questions/top_records.php

    为您的问题提供答案。

    【讨论】:

    • 请提供答案,而不是链接
    【解决方案3】:

    Oracle 12c 引入了row limiting 子句:

    SELECT *
    FROM   table
    ORDER BY "date" DESC
    FETCH FIRST 40 ROWS ONLY;
    

    在早期版本中,您可以这样做:

    SELECT *
    FROM   ( SELECT *
             FROM   table
             ORDER BY "date" DESC )
    WHERE  ROWNUM <= 40;
    

    SELECT *
    FROM   ( SELECT *,
                    ROW_NUMBER() OVER ( ORDER BY "date" DESC ) AS RN
             FROM   table )
    WHERE  RN <= 40;
    

    SELECT *
    FROM   TEST
    WHERE  ROWID IN ( SELECT ROWID
                      FROM   ( SELECT "Date" FROM TEST ORDER BY "Date" DESC )
                      WHERE  ROWNUM <= 40 );
    

    无论您做什么,数据库都需要查看 date 列中的所有值以找到前 40 个项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2019-06-22
      • 2011-03-07
      • 2021-09-14
      • 1970-01-01
      • 2016-05-24
      相关资源
      最近更新 更多