【问题标题】:Oracle Database: the order of a query resultOracle 数据库:查询结果的顺序
【发布时间】:2013-02-19 15:28:54
【问题描述】:

假设有一个表,列有:Id(主键)、myTime、myName

然后你执行查询:

select * from mytable order by myTime

但在 myTime 中有几个具有相同值的条目。使用哪个顺序排列结果?我在几台机器上试过这个例子,结果不同。 myTime 值相同的结果因机器而异(尽管两台机器使用相同版本的 Oracle DDBB 10g)。

谢谢。

【问题讨论】:

  • 如您所见,顺序是不可预测的。
  • Oracle 按您的要求做:按 mytime 订购。因此,如果两个值具有相同的 mytime,您将无法猜测哪个值会先排序。如果你想要一种更适合你需要的排序,你必须改变一些东西。
  • 是的,我也是按 myName 列订购的。

标签: oracle oracle10g


【解决方案1】:

顺序将取决于表的访问方法,可能还有排序算法,但通常(我认为并非总是如此)您会看到隐式排序顺序将按 rowid 如果index 已用于提供排序顺序。如果使用完全扫描和排序,那么我不想猜测。

如果需要确定性排序顺序,请按主键或唯一键添加顺序。 ROWID 的二级排序顺序在某些应用程序分页的情况下可能会有所帮助。

【讨论】:

  • implicit sort order will be by rowid - 很可能不是(有很多其他访问路径会导致完全不同的“订单”。按 ROWID 排序是一个非常糟糕的主意 - 对于分页,您应该使用 @987654322 @ 结合rownumrow_number()
  • "...如果使用索引来提供排序顺序,则按 rowid",因为索引按 rowid 对具有相同值的行进行排序,因此很可能是它们的返回方式。除此之外,仅在需要排序顺序的短期稳定性的情况下,按 rowid 排序才很方便,例如当应用程序依赖确定性排序顺序来正确分页时。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多