我正在复习和学习 SQL,我注意到有些东西对我来说似乎很好奇。
假设我有一个名为的表productos
,其中一个字段是categoria
,在执行以下查询时,我看到结果是相同的:
SELECT DISTINCT categoria FROM productos;
是
SELECT categoria FROM productos GROUP BY categoria;
我注意到的不同之处在于,DISTINCT
它过滤重复项并尊重它们出现的顺序,而它使用的句子GROUP BY
按字母顺序组织它们。基于此,可以说第一条语句执行得更快。如果是这样,在处理大量数据时,性能差异会很大吗?
尽管很明显这两种技术都获得了相同的最终结果,但并非所有技术都被视为对您想要达到的结果有效。
考虑到您提出的建议,正确的做法是使用
DISTINCT
,因为它适用于行,而不是GROUP BY
创建用于聚合,例如SUM()
、MAX()
、AVG()
等。顺序问题不会成为问题,因为
ORDER BY
可以解决差异。在这些链接中,虽然它们是英文的,但也提出了同样的问题:
GROUP BY 和 DISTINCT 之间有什么区别吗
GROUP BY 和 DISTINCT 有什么区别?
GROUP BY
它更多地用于以下类型的操作:count
,sum
等。根据表中的记录数(谈论数百万条记录),
select
(无论是 withdistinct
还是 withgroup by
)将花费或多或少相同的时间如果情况是表有数百万条记录(100、200、500),有时最好将要分组的数据提取到临时表(
select ... insert
)中,然后在临时表上执行distinct
或group by
。查询时间要快得多。除了 Leandro 所评论的内容以及作为他本人附加的链接中答案之一的忠实翻译之外,答案因引擎而异,但您可以拥有这两个数据库引擎的范围:
RPTA:
没有区别(至少在 SQL Server 中)两个查询都使用相同的执行计划。
http://sqlmag.com/database-performance-tuning/distinct-vs-group
如果涉及子查询,也许会有区别:
http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/
没有区别(Oracle 风格):
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212
该功能
DISTINCT
删除重复记录,该功能GROUP BY
用于对记录进行分组。函数
DISTINCT
执行如下:business_key
值复制到临时表函数
GROUP BY
执行如下:business_key
在一个hashtable
hashtable
第一个优化内存,而第二个优化速度但需要大量内存,具体取决于键的数量。
问候。
第一个选项只是在找到行时过滤行,但必须遍历所有行才能获得结果。当您使用
group by
主要返回的结果时,它会根据分组值(在您的情况下按“类别”)对其进行重新处理以对其进行排序。不使用索引,第一个选项更快。但是,如果您在“类别”字段上放置索引,则查询group by
几乎一样快。请记住,每个替代方案都是根据您需要的结果使用的。