【问题标题】:Is the order of a view guaranteed?视图的顺序是否有保证?
【发布时间】:2019-02-14 11:05:28
【问题描述】:

PostgreSQL 允许 ORDER BY 在视图中,所以例如我可以这样写一个视图:

CREATE VIEW people_overview AS
SELECT
    id
  , name1
  , name2
FROM person
ORDER BY
    name2
  , name1

假设我有一个应用程序,我现在像这样使用这个视图:

SELECT * FROM people_overview

然后应用读取所有数据并以某种方式将其显示给用户,例如使用网格。

在这种情况下,当将行返回给应用程序时,是否保证在视图中指定的顺序保持不变?

或者我最好将ORDER BY 编码到应用程序中?

【问题讨论】:

  • 如果我在视图中看到order by,我总是很害怕,因为 Postgres 不够聪明,无法删除无用的订单。做select * from people_overview order by id(所以我想你可以依赖它,但我仍然发现在最终选择中做order by更好的编码风格)
  • ORDER BY 可能很昂贵。如果有人想要查看数据而没有任何订单偏好,那么如果在视图定义中指定,ORDER BY 成本仍然存在。
  • 好问题。它不应该保证视图中的顺序。但是,我在 Postgres 文档中找不到任何说明这一点的内容。

标签: sql postgresql sql-order-by


【解决方案1】:

根据 cmets;在没有 ORDER BY 的情况下定义视图(除非某些子查询需要它用于 TOP N ROWS 类型的目的)并让视图的最终用户确定他们想要的排序顺序(因为它可以保证是他们想要的并且风险较小数据将被排序两次,一次是不必要的——优化器应该意识到如果应用了select * from view order by x,则视图中的排序是多余的,但是冒险/放入额外的代码混乱没有多大意义)。

我可能还会将此理念扩展到诸如数据转换/格式化之类的事情 - 将数据保留为存储形式,以便它尽可能长时间地保持有用,并让调用应用程序决定格式化(即不要将所有日期格式化为视图中的 yyyyMMdd 字符串,如果调用应用程序必须再次解析它以对其进行一些数学运算等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多