请教一下,使用 SQL中的 distinct 或 group by 什么时候会自动排序
发现有些时候,没加order by,查询结果也被排序了,或者发现性能不佳时,看执行计划有 sort 的开销,而且还不小,求教,这是为什么呢,么呢,呢。。。。
[解决办法]
首先,不是一定排序,如果排序是因为你的输入数据无法进行那两个操作,其实很好理解,计算机不是人,不能肉眼看出是否重复,那么要怎么做呢?先排序,这样相同的数据就会排在一起,然后再过滤重复值
[解决办法]
按照拇指定律,一般sort超过25%的开销,可能就要注意了。一般可以通过调整索引的方式来处理,另外就是通过类似where条件来减少数据量,这样即使出现sort也不会有太多性能问题。
还有就是merge join时候,如果表没有排序,也会引入sort来预排序再join
[解决办法]
1、没加order by ,也没有用distinct、group by,而结果排序,可能是因为你的表中有索引导致的,可能是按照了索引所属字段来排序,这个倒是不会有什么开销。
2、用distinct、group by时候,用于去重,所以必须要排序,但是如果这好group by或者distinct 的字段是索引中的字段,那么在执行计划中,就不用专门排序,因为索引中的数据,已经经过排序。
如果,还有一个sort的符号,那说明,你的字段上没有索引,所以必然会导致排序的操作。
[解决办法]
所以这个时候,可以考虑 建个索引,不过,这个只是针对字段较少的情况下。
如果你的字段,比如:
select distinct a,b,c,d,e...
from tb
那么就没办法避免排序了