当未提供ORDER BY时,postgres如何排序结果

Mec*_*con 4 sql postgresql select sql-order-by

假设我有两个表:

user (user_name varchar(50), project_name varchar(50))
project (project_name varchar(50), project_cost(integer))
Run Code Online (Sandbox Code Playgroud)

我有一个查询,返回的结果是“实际需要的”:

select u.user_name, p.project_name 
from user u, project p 
where u.project_name = p.project_name
Run Code Online (Sandbox Code Playgroud)

Postgres说,当不给出ORDER BY时,行的顺序是不可预测的。但是在我的本地测试中,postgres以相同的顺序返回行以进行重复测试。

您能否帮助我了解order by在查询中未提供Postgres的实际功能?

我无法访问所有实际表和架构都可能存在的地方,因此我真的需要知道实际情况如何才能保持现有订单的完整性。

Mur*_*nik 6

如果未order by给出任何子句,则postgres(以及任何其他合理的数据库)应按能够产生行的顺序返回行(从内部缓存,索引还是直接从表中返回)。

由于对相同的数据使用相同的算法,因此以相同的顺序获取相同的行也就不足为奇了。但是,这并不意味着您应该依赖此顺序。如果您要执行某些操作以更改磁盘上数据的布局(例如,备份并还原它,甚至重建表的索引),则可能会获得不同的顺序。

  • @Mecon:您甚至不需要对数据做任何事情。Postgres具有一项称为“同步seq扫描”的功能,这意味着一个查询甚至可以在表中途重复使用当前正在运行的seq-scan。这意味着即使磁盘上没有任何变化并且两个都使用相同的执行计划,两个同时执行的SELECT语句仍可能以完全不同的顺序返回数据。 (2认同)