此问题涉及使用其他函数或解决方法的first_value()
的功能。从分组列中采样重复值的最佳性能
这也是关于“大表中的小增益”。使用例如。 max()
在下面解释的上下文中,要求虚假的比较。即使速度很快,也会带来一些额外的成本。
这种典型的查询
SELECT x, y, count(*) as n
FROM t
GROUP BY x, y;
需要重复所有列在GROUP BY
返回多个列。一个语法糖要做到这一点,是使用位置引用:
SELECT x, y, count(*) as n
FROM t
GROUP BY x, 2 -- imagine that 2, 3, etc. are repeated with x
有时不仅需要糖,但也有一些语义理解复杂的情境:
SELECT x, COALESCE(y,z), count(*) as n
FROM t
GROUP BY x, y, z -- y and z are not "real need" grouping clauses?
我可以想像其他许多复杂的环境。让我们来看看常用解决方案:
SELECT x, max(y) as y, count(*) as n
FROM t
GROUP BY x -- best semantic! no need for other columns here
其中max()
功能可以是任何“样本()”(例如第一个或最后一个值)。无所事事的表现优于max()
,例如,聚合函数first_value()
,但它需要一个WINDOW
,所以性能下降。有一些旧建议to implement first/last agg functions in C。
是否有一些“获得任意一个值的快速”聚合函数,性能比max()
或GROUP BY X,2,...
更好?
也许最近发布的一些新功能?
请[编辑]你的问题,并添加基于该数据的一些样本数据和预期输出。如果你在列上有一个索引,max()'将会非常快。你可能希望查看'limit'或'distinct on()'还有,如果你的查询很慢,那么使用'explain(analyze,verbose)' –
来提供查询,全表定义和执行计划。 '不懂'max()'函数的意思可以是任何“sample()”。你的意思是“聚合函数”?另外如果问题是如何使聚合函数更快,那么关于句法糖的所有介绍都与它有关? –
有一种方法来模拟postgres上的松散索引扫描,这将是最快的https://wiki.postgresql.org/wiki/Loose_indexscan – Mihai