gpt4 book ai didi

sql - 使用带有 MAX() 的 GROUP BY 作为聚合与使用 ROW_NUMBER 进行分区相比,是否存在性能差异?

转载 作者:行者123 更新时间:2023-12-02 13:35:33 27 4
gpt4 key购买 nike

以下 2 个查询之间是否存在性能差异,如果有,那么哪一个更好?:

    select 
q.id,
q.name
from(
select id, name, row_number over (partition by name order by id desc) as row_num
from table
) q
where q.row_num = 1

对比

select
max(id) ,
name
from table
group by name

(结果集应该相同)

这是假设没有设置索引。

更新:我对此进行了测试,group by 速度更快。

最佳答案

我有一个大约 450 万行的表,我编写了带有 GROUP BY 的 MAX 以及 ROW_NUMBER 解决方案,并对它们进行了测试。 MAX 需要对表进行两次聚集扫描,一次用于聚合,第二次用于连接其余列,而 ROW_NUMBER 仅需要一次。 (显然可以对其中一个或两个进行索引以最小化 IO,但重点是 GROUP BY 需要两次索引扫描。)

根据优化器,在我的例子中,根据子树成本,ROW_NUMBER 的效率提高了大约 60%。而且根据IO统计,CPU时间大约减少20%。然而,在实际运行时间中,ROW_NUMBER 解决方案实际花费的时间大约多出 80%。所以 GROUP BY 在我的例子中获胜。

这似乎与此处的其他答案相匹配。

关于sql - 使用带有 MAX() 的 GROUP BY 作为聚合与使用 ROW_NUMBER 进行分区相比,是否存在性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11233125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com