distinct簡單來說就是用來去重的,而group by的設計目的則是用來聚合統計的,兩者在能夠實現的功能上有些相同之處,但是2者的性能差距很大
對於一個84萬數據量的表,count(distinct(XXX))的查詢需要20s,而group by僅需1s,性能相差20倍
原理分析:
distinct方式就是兩兩對比,需要遍歷整個表,大多數情況下都會導致對最終結果集進行一次排序;
group by分組類似先建立索引再查索引,所以兩者對比,小表distinct快,不用索引。大表group by快。一般來說小表就算建索引,也不會慢到哪兒去;但如果是TB級大表,遍歷簡直就是災難。
所以distinct一直是sql語言中成本最高的函數之一,很多Oracle項目都禁止使用distinct語句,全部要求替換成group by。