【问题标题】:Select without order by不按顺序选择
【发布时间】:2016-09-13 14:16:15
【问题描述】:

据我了解,select 不能保证总是返回相同的结果。

以下查询不保证每次都返回相同的结果:

select * from myTable offset 10000 limit 100

我的问题是,如果 myTable 在 select 执行之间没有更改(没有删除或插入),我可以依靠它每次返回相同的结果集吗?

或者换一种说法,如果我的数据库因更改而被锁定,我可以依靠 select 返回相同的结果吗?

我正在使用 postgresql。

【问题讨论】:

  • 别指望它...
  • 不,即使没有任何更改,您也不能依赖订单。例如Postgres 有一个称为“同步序列扫描”的功能,这意味着运行相同查询的两个用户共享相同的“序列扫描”过程,这可能会为每个查询产生不同的顺序
  • 我不会依赖它。
  • 为什么不直接添加订单而不用担心呢? (如果你的提议在野外落到了我的盘子里,我不会对“无论是谁干的......”都不太满意)
  • @Damien_The_Unbeliever, @jleach 我之所以要寻找答案是因为我已经执行了删除操作,只是忘记添加 order_by 子句,我正在努力解决我弄得有多乱。问题并没有说“我不想使用ORDER_BY 子句”,所以请不要做出这些假设并不公平地批评 OP。

标签: sql postgresql select sql-order-by


【解决方案1】:

表和结果集(没有order by)根本没有排序。真的就是这么简单。

在某些数据库中,在某些情况下,顺序会保持一致。但是,您应该永远依赖于此。例如,后续版本可能会使查询无效。

对我来说,我认为理解这一点的最简单方法是考虑并行处理。当您执行查询时,不同的线程可能会出去并开始获取数据;首先返回哪些值取决于不可重现的因素。

另一种思考方式是考虑内存中已经有页面的页面缓存——可能从表的末尾开始。 SQL 引擎可以按任何顺序读取页面(尽管实际上这不会发生)。

或者,其他一些查询可能有行或页面锁定,因此在读取记录时会跳过该页面。

所以,只要接受无序意味着有序意味着什么。如果您希望数据按特定顺序添加,请添加 order by。如果使用聚集索引键,则基本上不会影响性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多