前几天我学了一些关于SQL的简单知识:
SELECT c FROM myTbl GROUP BY C
结果与:
SELECT DISTINCT C FROM myTbl
我好奇的是,SQL引擎处理命令的方式有什么不同,还是它们真的是一样的东西?
我个人更喜欢独特的语法,但我相信这更多是出于习惯而不是其他原因。
编辑:这不是一个关于聚合的问题。理解了GROUP BY与聚合函数的使用。
前几天我学了一些关于SQL的简单知识:
SELECT c FROM myTbl GROUP BY C
结果与:
SELECT DISTINCT C FROM myTbl
我好奇的是,SQL引擎处理命令的方式有什么不同,还是它们真的是一样的东西?
我个人更喜欢独特的语法,但我相信这更多是出于习惯而不是其他原因。
编辑:这不是一个关于聚合的问题。理解了GROUP BY与聚合函数的使用。
当前回答
在Teradata透视图:
从结果集的角度来看,在Teradata中使用DISTINCT或GROUP BY并不重要。答案集是一样的。
从性能的角度来看,这是不一样的。
要了解什么会影响性能,您需要知道在使用DISTINCT或GROUP BY执行语句时Teradata上发生了什么。
在DISTINCT的情况下,行被立即重新分配,而不发生任何预聚合,而在GROUP BY的情况下,第一步完成预聚合,然后才在amp之间重新分配唯一值。
现在不要认为GROUP BY从性能角度来看总是更好。当您有许多不同的值时,GROUP BY的预聚合步骤不是很有效。Teradata必须对数据进行排序以删除重复项。在这种情况下,最好先重新分配,即使用DISTINCT语句。只有当有许多重复值时,GROUP BY语句可能是更好的选择,因为只有在重分发之后才执行重复数据删除步骤。
简而言之,DISTINCT vs. GROUP BY在Teradata中的意思是:
GROUP BY ->用于多个重复 DISTINCT ->没有或只有几个重复项。 在使用DISTINCT时,有时会耗尽AMP上的线轴空间。原因是重新分配立即发生,倾斜可能会导致AMP耗尽空间。
如果发生这种情况,使用GROUP BY可能会有更好的机会,因为在第一步中已经删除了重复项,并且在amp之间移动的数据更少。
其他回答
对于你发布的查询,它们是相同的。但对于其他查询,这可能不是真的。
例如,它不等同于:
SELECT C FROM myTbl GROUP BY C, D
如果对多个列使用DISTINCT,结果集将不会像使用GROUP BY那样进行分组,并且不能对DISTINCT使用聚合函数。
我预计在执行上可能会有细微的差异。 我检查了Oracle 10g中两个功能相同的查询的执行计划:
core> select sta from zip group by sta;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 58 | 174 | 44 (19)| 00:00:01 |
| 1 | HASH GROUP BY | | 58 | 174 | 44 (19)| 00:00:01 |
| 2 | TABLE ACCESS FULL| ZIP | 42303 | 123K| 38 (6)| 00:00:01 |
---------------------------------------------------------------------------
core> select distinct sta from zip;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 58 | 174 | 44 (19)| 00:00:01 |
| 1 | HASH UNIQUE | | 58 | 174 | 44 (19)| 00:00:01 |
| 2 | TABLE ACCESS FULL| ZIP | 42303 | 123K| 38 (6)| 00:00:01 |
---------------------------------------------------------------------------
中间的操作略有不同:“HASH GROUP BY”和。“HASH唯一”,但估计成本等是相同的。然后,我在跟踪的情况下执行这些操作,两者的实际操作计数是相同的(除了第二个操作由于缓存而不需要进行任何物理读取)。
但我认为,由于操作名称不同,执行将遵循不同的代码路径,这可能会带来更大的差异。
出于这个目的,我认为您应该更喜欢DISTINCT语法。这不仅仅是习惯,它更清楚地表明了查询的目的。
我对它的理解是,使用distinct就相当于按照所选字段的顺序对它们进行分组。
i.e:
select distinct a, b, c from table;
等于:
select a, b, c from table group by a, b, c
我知道这是一个旧帖子。但碰巧的是,我有一个查询,使用组通过只是返回不同的值时,使用该查询在蛤蟆和oracle报告一切都工作得很好,我的意思是一个很好的响应时间。当我们从Oracle 9i迁移到11g时,Toad中的响应时间非常好,但在报告中,完成报告需要35分钟,而使用以前的版本大约需要5分钟。
解决方案是通过使用DISTINCT更改组,现在报告在大约30秒内运行。
我希望这对有同样情况的人有用。