sql - 关于 SQL/Postgres 中聚合函数内部的问题

标签 sql postgresql aggregate-functions

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

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

它是否按 id 排序,然后对每个范围内的相等 id 求和?我不是规划师专家,但看起来这就是正在发生的事情,我的表可能有一亿行和几百万个不同的 ID。

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

最佳答案

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

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

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

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

遵循 SQL 标准的查询优化器可以自由地按照他们喜欢的方式重新排列事物,只要结果与遵循这些步骤的结果相同即可。

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

关于sql - 关于 SQL/Postgres 中聚合函数内部的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412982/

相关文章:

sql - 动态转换数组元素的类型以匹配 PostgreSQL 查询中的某些表达式类型

debugging - 调试器数据库应用程序和查询

postgresql - Postgres 中的简单存储过程

mysql - SQL 查询 - 按日期排序但也按组排序

php - 一个 SQL 查询,还是一个循环中的多个?

sql - Rails 聚合查询对满足特定条件的行进行计数

sql - 连接和排序 1 :n relationship 中两个表的不同行

来自另一个表的 SQL 计数列

sql - 一个简单的 postgresql 查询的算法改进

postgresql - 为什么 "||"在 PostgreSQL/Redshift 中用作字符串连接