Mar*_*ina 6 sql group-by sql-server-2008 database-partitioning
以下两个查询之间是否存在性能差异?如果是,那么哪个更好?:
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
Run Code Online (Sandbox Code Playgroud)
与
select
max(id) ,
name
from table
group by name
Run Code Online (Sandbox Code Playgroud)
(结果集应该相同)
这是假设未设置索引。
更新:我对此进行了测试,并且group by速度更快。
小智 6
我有一个大约 450 万行的表,我用 GROUP BY 和 ROW_NUMBER 写了一个 MAX 并测试了它们。MAX 需要对表进行两次集群扫描,一次用于聚合,另一次用于连接到其余的列,而 ROW_NUMBER 只需要一次。(显然,可以对其中一个或两个进行索引以最小化 IO,但重点是 GROUP BY 需要两次索引扫描。)
根据优化器的说法,在我的情况下,根据子树成本,ROW_NUMBER 的效率提高了大约 60%。而且根据IO统计,CPU时间减少20%左右。但是,在实际经过的时间中,ROW_NUMBER 解决方案需要大约 80% 以上的实时时间。所以在我的情况下 GROUP BY 获胜。
这似乎与此处的其他答案相符。
group by 应该更快。行号必须为表中的所有行分配一行。它在过滤掉不需要的那些之前这样做。
到目前为止,第二个查询是更好的构造。首先,您必须确保分区子句中的列与您想要的列匹配。更重要的是,“group by”是 SQL 中一个易于理解的结构。我还推测 group by 可能会更好地利用索引,但那是推测。