我有以下查询
SELECT *
FROM table_1
INNER JOIN table_2 ON table_1.orders = table_2.orders
ORDER BY table_2.purchasetime;
上面的查询结果是不确定的,即当购买时间与MySQL手册本身具有相同的值时,它可以随着不同的查询而改变。为了克服这一点,我们在一个唯一的列上给出排序顺序并将其与常规排序顺序相结合
客户不希望在不同的页面刷新时看到不同的结果,所以我们专门针对MySQL进行了上述修复,这是不必要的,并且需要asc和desc的额外复合索引。
我不确定这是否适用于postgres。到目前为止,我还没有能够重现这个场景。如果有人可以为postgres回答这个问题或者指出我正确的方向,我将不胜感激。
编辑1 :排序列已编入索引。假设磁盘数据没有排序,但在索引(btree数据结构)的情况下,postgres可能会有一个常量排序吗?
答案 0 :(得分:3)
不,它在PostgreSQL中没有什么不同(或者,事实上,在我知道的任何其他关系数据库中)。
请参阅http://www.postgresql.org/docs/9.4/static/queries-order.html:
在查询生成输出表之后(在处理选择列表之后),可以选择对其进行排序。如果未选择排序,则将以未指定的顺序返回行。 在这种情况下,实际的顺序取决于扫描和连接计划类型以及磁盘上的顺序,但不能依赖。只有明确选择了排序步骤,才能保证特定的输出顺序。
即使偶然你设法找到一个PostgreSQL版本和索引来保证你运行的所有测试中的订单,请不要依赖它。任何数据库升级,数据更改或Maya日历中的更改或月亮阶段都会突然扰乱您的排序顺序。然后调试它是一个真正可怕的痛苦。
答案 1 :(得分:1)
当有多个行具有相同值时,您的担忧似乎是order by table_2.purchasetime
是不确定的。
要修复此问题 - 在任何数据库或任何计算机语言中 - 您需要一个稳定的排序。您可以通过添加唯一键将任何排序转换为稳定排序。因此,添加一个唯一的列(通常是某种类型的id)可以在MySQL和Postgres(以及任何其他数据库)中修复它。
我应该注意到,各种不稳定可能是一个非常微妙的问题,只会在某些情况下出现。所以,你可以多次运行相同的查询,这很好。然后插入或删除记录(甚至可能是查询未选择的记录)并更改订单。