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

Hen*_*k N 14 sql postgresql sql-order-by

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

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

SELECT * FROM items;
Run Code Online (Sandbox Code Playgroud)

没有保证的订单.

SELECT * FROM items ORDER BY published_date ASC;
Run Code Online (Sandbox Code Playgroud)

保证两个项目具有不同的日期来,在给定的顺序,但并不能保证两个项目具有相同的日期总是以相同的顺序.

SELECT * FROM items ORDER BY published_date ASC, id ASC;
Run Code Online (Sandbox Code Playgroud)

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

我有这个权利吗?

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

vye*_*rov 11

除非您使用该子句明确指定,否则不保证订单ORDER BY.

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

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

简而言之:您甚至可能按照所需顺序获取行,但这只是巧合.

  • @GerardoLima:是的,这*是*只是一个巧合。在 PostgreSQL 中,如果您运行完全相同的只读查询 1000 次,而没有对数据库进行任何更改,并且没有“ORDER BY”子句来强制排序,则您几乎每次都可以获得相同的订单,但是有只是几次执行就会产生不同的顺序。一个原因是您的查询可能足够复杂,可以使用“遗传查询优化器”,它使用启发式方法来考虑计划的随机子集。或者查询可能使用顺序表扫描;它将“加入”已经在进行中的 seqscan 作为优化。 (2认同)