我有一个包含partner_id
,dummy
和clicks
列的表格。现在我想通过partner_id和dummy来执行简单的任务来累计点击次数。但我有额外的知识,dummy
对于固定的partner_id始终是恒定的。例如,让我们采用下表data
:
partner_id dummy clicks
1 a 10
1 a 15
2 b 100
现在我想进行聚合以获得这个:
partner_id dummy clicks
1 a 25
2 b 100
显而易见的解决方案是
SELECT
partner_id,
dummy,
SUM(clicks)
FROM
data
GROUP BY
partner_id,
dummy
但是因为我知道假人对于每个partner_id都是一样的,我也可以去
SELECT
partner_id,
MAX(dummy) AS dummy,
SUM(clicks)
FROM
data
GROUP BY
partner_id
我的问题是,如果一个选项具有明确的更好性能 我认为第二个选项比第一个选项具有更好的性能,但我确实没有找到任何资源来验证这一点。查看两个查询的阶段计划,除了分组阶段的明显差异外,它们非常相似。
答案 0 :(得分:1)
1号肯定会有更好的表现。根据数据的大小,选项2将需要在聚合期间进行一些额外的处理以找到最大值(它将迭代整个组以获得最大值),考虑到列“虚拟”,您已经知道它们总是相同的“在集团层面具有相同的价值。考虑到mapreduce框架行为,选项1和2将在组中具有相同的工作量和分布,如果您将列虚拟或不添加到组中则无关紧要。