11

以下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速度更快。

4

3 回答 3

6

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

根据优化器的说法,在我的例子中,根据子树成本,ROW_NUMBER 的效率提高了大约 60%。而且据统计IO,CPU时间减少了约20%。但是,在实际经过的时间内,ROW_NUMBER 解决方案需要多出大约 80% 的实时时间。所以 GROUP BY 在我的情况下获胜。

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

于 2017-11-16T21:08:13.083 回答
5

group by 应该更快。行号必须为表中的所有行分配一行。它会在过滤掉它不想要的之前执行此操作。

到目前为止,第二个查询是更好的构造。首先,您必须确保分区子句中的列与您想要的列相匹配。更重要的是,“group by”在 SQL 中是一个很好理解的结构。我还推测 group by 可能会更好地利用索引,但这是推测。

于 2012-06-27T19:05:29.120 回答
2

我会使用group by name.

name, id DESC当索引为(计划1)时,它的内容不多

但是如果索引被声明为name, id ASC计划 2),那么在 2008 年我看到该ROW_NUMBER版本无法使用该索引并进行排序操作,而GROUP BY能够使用向后索引扫描来避免这种情况。

您需要检查您的 SQL Server 版本以及您的数据和索引上的计划以确定。

于 2012-06-27T19:03:30.910 回答