【问题标题】:Is order by mandatory for pagination in oracle? [duplicate]oracle中的分页顺序是强制性的吗? [复制]
【发布时间】:2018-07-15 04:36:57
【问题描述】:

我想知道oracle中的分页。为了在sql server中进行分页,有OFFSET ROWS FETCH NEXT,其中order by是强制性的才能进行分页。

我想弄清楚我是否要在 oracle 中进行分页order by 强制。

以下是我了解到的在 oracle 中进行分页的方法:

1) OFFSET n ROWS FETCH NEXT m ROWS ONLY: 订单是强制性的,这里是猜测。

2) 行数: 有了这个,我不确定orderby是否是强制性的分页 与 RowNum。

我正在尝试找出以下问题的答案,如果有人可以帮助我解答,我将不胜感激:

1) 是否必须使用 OFFSET n ROWS FETCH NEXT m ROWS ONLY 进行排序?

2) RowNum 是否必须按顺序排列?

如果我有这样的选择查询:

select Id,Amount from source

3) 如何在上面的sql查询中使用RowNum创建分页?

【问题讨论】:

  • 想想如果你只有 10 条数据并且你对 2 行进行分页。现在,当您尝试获取下 2 行时,它将来自您的 10 个数据中的任何一个。重复您的行数据有一些更改,但如果您执行 orderby,您将始终显示新行。
  • 检查subquery。看起来ORDER BY 不是强制性的。
  • @WernfriedDomscheit 仍然有按条款提及的顺序
  • 是的,但是根据图表你可以绕过它。检查documentation要获得一致的结果,请指定 order_by_clause 以确保确定的排序顺序。因此,您可以省略但结果不再是确定的。请先阅读文档 - 第二次询问。
  • @User - 是的,因为它不是确定性的。 order-by 在语法上不是强制性的,但在逻辑上是必要的。

标签: sql oracle pagination


【解决方案1】:

1) 是否必须使用 OFFSET n ROWS FETCH NEXT m ROWS ONLY 进行排序?

语法上不是,语义上是!

原因:如果不添加ORDER BY 子句,数据库可能会以任意顺序返回订单。现在,如果您首先对第一页执行查询,您将按任意顺序获取它们。下次您执行查询以获取下一页时,可能会返回任何其他行中的订单。

因此,您需要在ORDER BY 子句上建立明确的行顺序(这样没有一行与另一行是对等的)。在实践中,为了安全起见,您应该始终在 ORDER BY 子句中包含 unique/primary key 的内容。 (您仍然可以在 ORDER BY 子句中使用非唯一性——即使作为前导列)。

例如

ORDER BY time_stamp DESC, id DESC

这是对每个页面执行单独查询的所有类型的分页的逻辑要求。

2) RowNum 是否必须按顺序排列?

是的,见上文。

3) 如何在上面的sql查询中使用RowNum创建分页?

OFFSETROWNUM 都不足以实现稳定的分页。

想一想:如果在获取第一页之后和获取第二页之前插入新行怎么办?

还有另一种实现稳定分页的方法,称为键集分页。

主要思想不是通过告诉数据库要跳过多少行并希望同时没有添加任何行来跳过“看到的行”,而是使用唯一标识哪些行已经被看到,哪些没有。

SELECT ...
  FROM ...
 WHERE ...
   AND id < ?last_seen_id
 ORDER BY id DESC
 FETCH FIRST 10 ROWS ONLY

请记住,无论如何您都需要一个ORDER BY 来建立一个明确的订单。您可以使用这些列来确定您之前收到数据的位置。

在我的网站上阅读有关此方法的更多信息:

http://use-the-index-luke.com/no-offset

【讨论】:

  • 这个查询order所有记录和fetch在每个请求中,在大数据中性能低下
  • @HasanFathi 这完全是错误的。性能取决于索引,这也在链接方面进行了说明。
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多