【问题标题】:Are postgresql `SELECT DISTINCT` queries deterministic?postgresql `SELECT DISTINCT` 查询是确定性的吗?
【发布时间】:2020-04-12 02:11:59
【问题描述】:

Postgres SELECT DISTINCT 查询是确定性的吗?

如果表(和整个数据库)不变,SELECT DISTINCT somecolumn FROM sometable 会返回相同的结果(包括顺序)吗?

Select Query Documentation 描述部分说明:

如果指定了 ORDER BY 子句,则返回的行按指定的顺序排序。如果没有给出 ORDER BY,则以系统发现最快生成的任何顺序返回行。

他们在DISTINCT ON 子句部分添加:

请注意,每个集合的“第一行”是不可预测的,除非使用 ORDER BY 来确保所需的行首先出现。

通常,当数据库保持不变时,这仍然是正确的吗?

【问题讨论】:

  • only(实际上:only)获得确定性和稳定的行顺序的方法是ORDER BY。也不例外。
  • 既然你提到返回相同的结果(包括订单答案是否定的,不保证结果是否相同(包括订单)用于查询的两次执行。

标签: sql postgresql select distinct deterministic


【解决方案1】:

此答案假定select 中的表达式是确定性的。否则,这个问题似乎微不足道。

未指定排序,因此它可能会在查询运行之间或在不同系统上发生变化。但是,结果集应该是一样的。

您从文档中引用的第二条是distinct on。这不是确定性的,除非您使用的是稳定的排序。

注意:如果您使用不区分大小写的排序规则,您可能会得到不确定的结果。内置排序规则区分大小写;并且不区分大小写意味着原始表达式不是确定性的。

【讨论】:

  • select distinct ci_collation_column from... 怎么样?它可以有时返回 ABC,有时返回 abc 吗?
  • 会改变的原因是什么?它会使用一些随机性吗?
  • @DannyDannyDanny 。 . . distinct on 与您的问题无关。但是当你使用order by并且key相同时,数据库排序可以将具有相同key值的行按任意顺序排列。这可能是由于排序中固有的随机性(例如快速排序算法)、由于行/页上的锁定、由于多处理器环境中的时序以及许多其他原因造成的。
  • @DannyDannyDanny:distinct 通常使用散列算法完成,该算法完全打乱了值的任何“自然”顺序
  • @a_horse_with_no_name 。 . .但 distinct 适用于 all 列,因此结果是确定性的。我想你可能会在表达式中调用一个不确定的函数,这会搞砸事情。但是为了合理解释这个问题。
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 2021-07-06
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
相关资源
最近更新 更多