SQL -去重Group by 和Distinct的效率


經實際測試,同等條件下,5千萬條數據,Distinct比Group by效率高,但是,這是有條件的,這五千萬條數據中不重復的僅僅有三十多萬條,這意味着,五千萬條中基本都是重復數據。

為了驗證,重復數據是否對其有影響,本人針對80萬條數據進行測試:

下面是對CustomerId去重,CustomerId的重復項及其多,80萬條中僅僅50條不重復的。可以看到,Distinct快一點。

用例1:

 

 

用例2:

 

 

 

 

 

 

 

 

 

下面是對Id去重,Id基本唯一,80萬條中沒有重復的。可以看到,Group By更快。

 

 

 

 

綜上所述,其他條件一定時,數據重復項越多,distinct效率越高,反之,數據越唯一,group by效率越高。(測試用例較少,時間差距其實不明顯,受電腦影響,數據有時不准。所以具體數據具體試驗,不要盲目使用,人雲亦雲。)

原因:

distinct需要將列中的全部內容都存儲在一個內存中,可以理解為一個hash結構,key為列的值,最后計算hash結構中有多少個key即可得到結果。

很明顯,需要將所有不同的值都存起來,因此重復數據越多,需要存儲的不同項也越少。但這種方式內存消耗可能較大,看你電腦。

而group by的方式是先將列排序。而數據庫中的group一般使用sort的方法,即數據庫會先對列進行排序。而排序的基本理論是,時間復雜為nlogn,空間為1.,然后只要單純的計數就可以了。優點是空間復雜度小,缺點是要進行一次排序,執行時間會較長。

 兩中方法各有優劣,在使用的時候,我們需要根據實際情況進行取舍,不要一刀切。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM