如果在非唯一属性上排序,是否完全保证PostgreSQL顺序?
可能重复:如果在非唯一属性上排序,是否完全保证PostgreSQL顺序?,sql,postgresql,sql-order-by,Sql,Postgresql,Sql Order By,可能重复: 从阅读和我在PostgreSQL中看到的问题来看,我的印象如下,但该部分并不完全明确,因此如果有人能够验证,我将不胜感激: SELECT * FROM items; 没有保证的秩序 SELECT * FROM items ORDER BY published_date ASC; 保证两个日期不同的项目以给定顺序出现,但不保证两个日期相同的项目总是以相同顺序出现 SELECT * FROM items ORDER BY published_date ASC, id ASC; 始
从阅读和我在PostgreSQL中看到的问题来看,我的印象如下,但该部分并不完全明确,因此如果有人能够验证,我将不胜感激:
SELECT * FROM items;
没有保证的秩序
SELECT * FROM items ORDER BY published_date ASC;
保证两个日期不同的项目以给定顺序出现,但不保证两个日期相同的项目总是以相同顺序出现
SELECT * FROM items ORDER BY published_date ASC, id ASC;
始终以相同的顺序返回项目,因为它是完全确定的
我有这个权利吗
我不太清楚在一个属性上排序(如published\u date
)是否能保证具有相同值的记录的顺序,如第二个示例所示。顺序,除非您使用order BY
子句显式指定它
如果没有数据库活动,您可能会在多次执行时以相同的顺序获取数据,因为PostgreSQL只会按照它在数据库页面中找到的顺序返回行。做一个小测试:
- 按所需顺序插入多行李>
- 查询表:您将获得排序的行李>
- 更新集合中的第一条记录李>
- 再次查询表李>
- 观察结果
简而言之:您甚至可以按所需的顺序获取行,但这只是巧合。您做对了。唯一可以保证的订单是您的“订购人”强加的订单。如果在该顺序中存在可能的排列,那么这些都可能是有效的输出。这是问题的一个具体案例:一致的最终顺序不是巧合,因为这是因为底层数据访问及其内部组织。但是你说得对,用户不能依赖它,因为它可能会因为与应用程序完全无关的原因而更改,例如创建索引或数据库文件重新定位。谢谢!我阅读了该手册页面(从问题中链接出来),但我觉得它对于这个特殊情况不够明确。具体来说,“只有明确选择了排序步骤,才能保证特定的输出顺序。”不清楚是否通过在非唯一列上排序来“明确选择了排序步骤”。@HenrikN,正如@wildplasser提到的,
ORDER BY
中非唯一列集合中的所有排序变化都被视为正确结果。因此,应该阅读文档:如果您希望始终以“正确”的顺序接收数据,则应在order BY
子句中明确指定一组唯一的列。@GerardoLima:是的,这只是巧合。在PostgreSQL中,如果您运行完全相同的只读查询1000次,而没有对数据库进行任何更改,并且没有强制排序的orderby
子句,那么您几乎每次都可以获得相同的顺序,但只要执行几次,就会产生不同的排序。一个原因是您的查询可能足够复杂,使用“遗传查询优化器”,它使用启发式来考虑计划的随机子集。或者查询可能使用顺序表扫描;它将“加入”已在进行的seqscan作为优化。