问题 如果对非唯一属性进行排序,PostgreSQL订单是否完全有保证? [重复]


可能重复:
为什么SQL查询的结果不会按照我期望的顺序返回? 

从阅读 7.5排序行 从我在PostgreSQL中看到的问题来看,我的印象如下,但该部分并不完全明确,所以如果有人能够验证,我将不胜感激:

SELECT * FROM items;

没有保证的订单。

SELECT * FROM items ORDER BY published_date ASC;

保证具有不同日期的两个项目按给定顺序排列,但确实如此  保证具有相同日期的两个项目始终以相同的顺序排列。

SELECT * FROM items ORDER BY published_date ASC, id ASC;

始终以相同的顺序返回项目,因为它是完全确定的。

我有这个权利吗?

我不清楚是否对一个属性进行排序(例如 published_date)保证具有相同值的记录的顺序,如第二个示例中所示。


5498
2018-06-29 14:32


起源

你没事。唯一保证的订单是您的“订单”强加的订单。如果有可能的排列 中 这些顺序可能都是有效的输出。 - wildplasser
这是问题的具体情况: stackoverflow.com/questions/10999913/... - David Manheim


答案:


订购 不保证 除非你用。明确指定它 ORDER BY 条款。

可能 在没有数据库活动的情况下,在几次执行时以相同的顺序获取数据,因为PostgreSQL将按照它在数据库页面中找到的顺序返回行。做一个小测试:

  • 插入一些保持所需顺序的行;
  • 查询表:您将获得订购的行;
  • 更新集合中的第一条记录;
  • 再次查询表格;
  • 观察结果。

简而言之:你 可能 甚至得到了行 期望 订单,但这只是一个巧合。


11
2018-06-29 14:45



一致的最终订单是 不 巧合,因为这是因为底层数据访问及其内部组织。你是对的,用户不能依赖它,因为它可以因为与应用程序完全无关的原因而改变,因为创建索引或数据库文件重定位。 - Gerardo Lima
谢谢!我阅读了该手册页(从问题中链接),但我觉得这个特殊情况并不明确。 - Henrik N
具体而言,“只有明确选择排序步骤才能保证特定的输出排序。”通过在非唯一列上排序,不清楚“明确选择排序步骤”。 - Henrik N
@HenrikN,正如@wildplasser所提到的,所有排序变量都在一个非唯一的列中 ORDER BY 被认为是正确的结果。所以应该阅读文档:如果你愿意 总是 您可以按“正确”的顺序接收数据 应该 明确指定一组唯一列 ORDER BY 条款。 - vyegorov
@GerardoLima:是的,它 是 只是一个巧合。在PostgreSQL中如果你运行完全相同的只读查询1000次,而没有对数据库进行任何更改,则没有 ORDER BY强制命令的子句,你可以得到相同的命令 几乎 每一次,但只有几个执行产生不同的顺序。一个原因是您的查询可能足够复杂,无法使用“遗传查询优化器”,它使用启发式方法来考虑计划的随机子集。或者查询可能使用顺序表扫描;它将“加入”正在进行的seqscan作为优化。 - kgrittn