【问题标题】:question about aggregate function internals in SQL/Postgres关于 SQL/Postgres 中聚合函数内部的问题
【发布时间】:2011-03-23 23:33:08
【问题描述】:

像 SUM 这样的函数是如何工作的?如果我执行

select id,sum(a) from mytable group by id

它是否按 id 排序,然后对每个相等的 id 范围求和?我不是规划专家,但看起来就是这样,mytable 可能是一亿行,有几百万个不同的 id。

或者它只是保留一个 id -> current_sum 的散列,然后在每一行增加 id 的值或添加一个新键?这不是更快,更省内存吗?

【问题讨论】:

  • 最好考虑一下“更快”是否意味着更快地获取结果集的最后一行或第一行(或其他)。

标签: sql postgresql aggregate-functions


【解决方案1】:

SQL 标准试图规定外部行为,而不是内部行为。在这种特殊情况下,符合(众多)标准之一的 SQL 实现应该像按此顺序执行操作一样行事。

  1. 从 FROM 子句中的所有表构造函数构建一个工作表。 (您的示例中只有一个。)

  2. 在 GROUP BY 子句中,将工作表划分为组。将每组缩减为一行。将工作表替换为分组表。

  3. 解析 SELECT 子句中的表达式。

遵循 SQL 标准的查询优化器可以随意重新排列事物,只要结果与遵循这些步骤时的结果相同。

您可以在this SO question的答案和cmets中找到更多详细信息。

【讨论】:

    【解决方案2】:

    所以,我发现了这个,http://helmingstay.blogspot.com/2009/06/postgresql-poetry-aggregate-median-with.html,它声称它确实使用了累加器模式。嗯。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2022-06-29
      • 1970-01-01
      相关资源
      最近更新 更多