以下 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/