【问题标题】:Postgres default sort by id - worldshipPostgres 默认按 id 排序 - worldship
【发布时间】:2011-09-28 23:00:35
【问题描述】:

我需要设置 worldship 以从我们的一个 postgres 数据库中提取。我需要它,以便包按 id 排序。我没有办法(我知道)让 worldship 发送 order by 子句,所以我需要默认返回的记录由 id 返回。

关于第二个注释,我不知道 postgres 默认如何排序它在上次更改记录时的样子,所以如果我写了两个记录 id 1,2 然后在运行查询时更改记录 2,它会返回它们记录 2 排在第一位。

【问题讨论】:

  • 你能创建一个有问题的表的视图,以便按 id 排序吗?

标签: postgresql ups-worldship


【解决方案1】:

根据 sql 规范以未指定的顺序返回行,除非您添加 order by 子句。在 Postgres 中,这意味着您将按照在磁盘上读取活动行的顺序来获取行。

如果您想要一致的顺序而不需要添加 order by 子句,请按照 Jack 的评论中的建议创建一个视图。

【讨论】:

  • 这正是我所需要的(不是我“不得不”知道的真正的数据库人。
【解决方案2】:

没有“默认排序”之类的东西。表中的行未排序。

您可以使用视图来伪造这一点(正如 Jack Maney 所建议的那样),您无法影响返回的行的顺序。

但如果您这样做,请注意,在基于该视图的 SELECT 中添加额外的 ORDER BY 将对数据进行两次排序。

另一个选项可能是在该表上运行 CLUSTER 命令,以根据您想要的列对磁盘上的行进行物理排序。但是这个门槛不保证这些行是按那个顺序返回的。即使是普通的SELECT * FROM your_table 也没有(但机会相当高)。 您需要定期重新运行此语句,因为 CLUSTER 命令创建的顺序不会自动维护。

【讨论】:

    【解决方案3】:

    就其价值而言,可能并不多,PostgreSQL 的“默认”排序是基于记录最后更新的时间。最近更新的记录将显示在最后。

    【讨论】:

    • 你有这方面的文档参考吗?谢谢!
    • 我找不到这方面的任何文档。 PostgreSQL 似乎没有官方默认排序,但是在实践中,如果你不指定顺序,最后更新的记录会放在底部。
    【解决方案4】:

    您最终可以使用排序索引,它应该保证您检索行的顺序,以防查询计划命中索引,或者如果您强制它,但这种方法将不仅仅是迂回:)。 ORDER BY 子句是前面提到的方法。

    【讨论】:

    • 这是错误的。即使检索是通过索引完成的,结果的整体顺序也可能不会按索引值排序 - 而且它绝对不是保证(如果有的话,很有可能索引顺序将被保留)。
    • 错了。当数据已经被检索到时,索引就会出现,所以它不会有帮助。相反,它会使用户混淆所需数据存在于哪个索引上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多