sql group by vs. distinct

时间:2009-01-09 01:22:31

标签: mysql sql-server performance group-by distinct

当查询中没有完成聚合时,为什么有人会使用group by而不是?

此外,是否有人了解该组与MySQL和SQL Server中的不同性能注意事项。我猜测SQL Server有一个更好的优化器,它们可能接近等价,但在MySQL中,我期望显着的性能优势。

我对dba答案感兴趣。

编辑:

比尔的帖子很有意思,但不适用。让我更具体一点......

select a, b, c 
from table x
group by a, b,c

select distinct a,b,c
from table x

5 个答案:

答案 0 :(得分:29)

GROUP BY将行组映射到一行,每个特定列中的不同值,这些列甚至不一定必须在选择列表中。

SELECT b, c, d FROM table1 GROUP BY a;

此查询是合法的SQL(更正:仅在MySQL中;实际上它不是标准SQL,不受其他品牌支持)。 MySQL接受它,它相信你知道自己在做什么,以明确的方式选择bcd,因为它们是functional dependencies的{ {1}}。

但是,Microsoft SQL Server和其他品牌不允许此查询,因为它无法轻松确定功能依赖性。 编辑:相反,标准SQL要求您遵循单值规则,即必须在a子句中命名选择列表中的每一列或者是set函数的参数。

GROUP BY始终查看select-list中的所有列,并且只查看那些列。这是一种常见的误解,DISTINCT允许您指定列:

DISTINCT

尽管括号使SELECT DISTINCT(a), b, c FROM table1; 看起来像函数调用,但事实并非如此。它是一个查询选项,并且select-list的三个字段中的任何一个中的不同值将导致查询结果中的不同行。此选择列表中的一个表达式有围绕它的括号,但这不会影响结果。

答案 1 :(得分:18)

来自MS SQL Server的一些(非常小的)经验数据,来自我们数据库的几个随机表。

对于模式:

SELECT col1, col2 FROM table GROUP BY col1, col2

SELECT DISTINCT col1, col2 FROM table 

如果查询没有覆盖索引,则两种方式都会产生以下查询计划:

|--Sort(DISTINCT ORDER BY:([table].[col1] ASC, [table].[col2] ASC))
   |--Clustered Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]))

当有覆盖指数时,两者都产生了:

|--Stream Aggregate(GROUP BY:([table].[col1], [table].[col2]))
   |--Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]), ORDERED FORWARD)

因此从非常小的示例中,SQL Server肯定会同时对待它们。

答案 2 :(得分:3)

在MySQL中,我发现使用GROUP BY通常比DISTINCT更好。

执行“EXPLAIN SELECT DISTINCT”显示“使用where;使用临时”MySQL将创建一个临时表。

vs一个“EXPLAIN SELECT a,b,c来自T1,T2,其中T2.A = T1.A GROUP BY a”只显示“使用位置”

答案 3 :(得分:2)

两者都会在MS SQL Server中生成相同的查询计划....如果你有MS SQL Server,你可以启用实际的执行计划,看看哪一个更适合你的需求......

请查看这些帖子:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

http://www.sqlmag.com/Article/ArticleID/24282/sql_server_24282.html

答案 4 :(得分:0)

如果你真的在寻找不同的值,那么distinct会使源代码更具可读性(就好像它是存储过程的一部分)如果我正在编写即席查询,我通常会从组开始,甚至如果我没有聚合,因为我经常会把它们放在上面。