如果我有一张桌子

CREATE TABLE users (
  id int(10) unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL,
  profession varchar(255) NOT NULL,
  employer varchar(255) NOT NULL,
  PRIMARY KEY  (id)
)

我想获得所有专业领域的独特价值,什么会更快(或建议):

SELECT DISTINCT u.profession FROM users u

or

SELECT u.profession FROM users u GROUP BY u.profession

?


当前回答

在mySQL中,我发现GROUP BY将NULL视为不同的,而distinct不是。 采取完全相同的DISTINCT查询,删除了DISTINCT,并将所选字段添加为GROUP BY,并且由于其中一个字段为NULL,我得到了更多的行。

所以. .我倾向于相信mySQL中有更多的DISTINCT。

其他回答

下面是一个简单的方法,它将为每个查询打印2个不同的运行时间。

DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;

SET @t1 = GETDATE();
SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT
SET @t2 = GETDATE();
PRINT 'Elapsed time (ms): ' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar);

SET @t1 = GETDATE();
SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY
SET @t2 = GETDATE();
PRINT 'Elapsed time (ms): ' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar);

或尝试设置统计时间(Transact-SQL)

SET STATISTICS TIME ON;
SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT
SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY
SET STATISTICS TIME OFF;

它简单地显示了解析、编译和执行每条语句所需的毫秒数,如下所示:

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 2 ms.

如果你不需要执行任何组函数(如果你想将数值数据添加到表中,可以使用sum, average等),请使用SELECT DISTINCT。我怀疑它更快,但我没有任何表现。

在任何情况下,如果您担心速度,可以在列上创建索引。

这不是规则

对于每个查询....试着分开,然后按…分组比较完成每个查询的时间,并使用更快的....

在我的项目中,有时我使用group by和other distinct

在postgres的某些情况下,distinct可能比group by慢(不知道其他dbs)。

测试的例子:

postgres=# select count(*) from (select distinct i from g) a;

count 

10001
(1 row)

Time: 1563,109 ms

postgres=# select count(*) from (select i from g group by i) a;

count
10001
(1 row)

Time: 594,481 ms

http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I

所以要小心……:)

它们本质上是等价的(事实上,这就是一些数据库在底层实现DISTINCT的方式)。

如果其中一个更快,它就是DISTINCT。这是因为,尽管两者是相同的,但查询优化器必须捕获这样一个事实,即GROUP BY没有利用任何组成员,只利用了它们的键。DISTINCT将此显式化,因此可以使用稍微笨一点的优化器。

有疑问的时候,测试一下!