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

标签 sql sql-server-2008 group-by database-partitioning

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

相关文章:

c# - 有没有办法将 EF.Functions.Like 与 ESCAPE sql 关键字一起使用来防止通配符

mysql - 从按列值排序的表中获取记录

SQL Server 2008 将表达式转换为数据类型 int 的算术溢出错误

python - 列出 pandas 数据框中每组的唯一值计数

php - 包含 WHERE、AND、OR 子句的 SQL 语句出现问题 codeigniter

Mysql - 按另一个语句的计数排序

SQL 语句返回 4 年前 4 月 4 日

sql-server-2008 - 在 SQL Server Management Studio 中查看结果集的架构

mysql - MySQL表数据如何按半年聚合?

python - 使用 Pandas 为每个过滤器识别列中最接近的值