SQL去重是用DISTINCT好,仍是GROUP BY好?

SQL專欄面試

SQL基礎知識彙總markdown

SQL高級知識彙總ide

咱們知道DISTINCT能夠去掉重複數據,GROUP BY在分組後也會去掉重複數據,那這兩個關鍵字在去掉重複數據時的效率,究竟誰會更高一點?ui

1.使用DISTINCT去掉重複數據
咱們先看下面這個例子:3d

SELECT DISTINCT UnitPrice
FROM [Sales].[SalesOrderDetail]
WHERE UnitPrice>1000;

執行完以後的結果以下:code

SQL去重是用DISTINCT好,仍是GROUP BY好?

接下來,咱們將這個表裏的數據增大到194萬條,再重複上面的實驗。blog

--將表SalesOrderDetail插入到一張物理表中

SELECT * INTO Sales.Temp_SalesOrder
FROM [Sales].[SalesOrderDetail] ;

--經過新增的物理表進行自循環插入3次,將數據增長到1941072行

DECLARE @i INT;
SET @i=0
WHILE @i<4
BEGIN
--這裏沒有將SalesOrderDetailID這個自增加的放在列中,是爲了讓系統自動填充不一樣的數字進去,保證惟一性。
INSERT INTO Sales.Temp_SalesOrder
(SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,rowguid,ModifiedDate)

SELECT
SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,NEWID(),ModifiedDate
FROM Sales.Temp_SalesOrder
SET @i=@i+1;
END;

SELECT COUNT(1) FROM Sales.Temp_SalesOrder;

(提示:能夠左右滑動代碼)索引

將SalesOrderDetailID的自增加屬性取消掉以後,插入1000條自身的數據,這樣咱們就能夠獲得1000條重複的SalesOrderDetailID,相比1942072條記錄佔比很小了ci

以下圖,將自增加標識的是換成否後便可插入了。it

SQL去重是用DISTINCT好,仍是GROUP BY好?

INSERT INTO sales.Temp_Salesorder
SELECT TOP 1000 * FROM sales.Temp_Salesorder;

數據插入完整後,咱們在將上一講的內容重複一下,看看效果如何?

A.在沒建索引的狀況下,咱們只查詢UnitPrice這一列

SELECT UnitPrice FROM Sales.Temp_SalesOrder ;

咱們看一下執行狀況:

SQL去重是用DISTINCT好,仍是GROUP BY好?

接下來是鑑證奇蹟的時刻了,咱們加DISTINCT在UnitPrice前面試試

SELECT  DISTINCT  UnitPrice FROM sales.Temp_Salesorder;

SQL去重是用DISTINCT好,仍是GROUP BY好?

和以前的實驗結果一致,在執行時間沒有多大差異的狀況下,分析時間成倍的減小了。

B.當SalesOrderDetailID取消掉自增加屬性後就和普通列同樣了。

咱們來重複上面的步驟:

SELECT   SalesOrderDetailID FROM sales.Temp_Salesorder

執行完後結果以下:

SQL去重是用DISTINCT好,仍是GROUP BY好?

與上面的UnitPrice沒使用DISTINCT狀況基本一致。

而後咱們給SalesOrderDetailID加上DISTINCT後會怎麼樣呢?

SELECT DISTINCT  SalesOrderDetailID
FROM sales.Temp_Salesorder

咱們能夠看到以下執行狀況:

SQL去重是用DISTINCT好,仍是GROUP BY好?

從上圖能夠看到,DISTINCT已經排除了1000條記錄,可是在執行時花的時間比沒加DISTINCT更久了。

經過上述兩個實驗,咱們能夠得出這樣一條結論:在重複量比較高的表中,使用DISTINCT能夠有效提升查詢效率,而在重複量比較低的表中,使用DISTINCT會嚴重下降查詢效率。因此並非全部的DISTINCT都是下降效率的,固然你得提早判斷數據的重複量。

2.GROUP BY與DISTINCT去掉重複數據的對比

GROUP BY與DISTINCT相似,常常會有一些針對這兩個哪一個效率高的爭議,今天咱們就將這兩個在不一樣重複數據量的效率做下對比。

A.重複數據量多的狀況下,對UnitPrice進行去重

SELECT  DISTINCT  UnitPrice FROM sales.Temp_Salesorder;
SELECT  UnitPrice FROM sales.Temp_Salesorder GROUP BY UnitPrice;

將上述兩條語句一塊兒執行,結果以下:

SQL去重是用DISTINCT好,仍是GROUP BY好?

能夠看出兩條語句對應的執行時間GROUP BY比DISTINCT效率高一點點。

B.重複數據量少的狀況下,對SalesOrderDetailID進行去重

 
 

SELECT DISTINCT SalesOrderDetailID FROM sales.Temp_Salesorder
SELECT SalesOrderDetailID FROM sales.Temp_Salesorder
GROUP BY SalesOrderDetailID

 
 

也是同時執行上述兩條語句,其結果以下:

SQL去重是用DISTINCT好,仍是GROUP BY好?

做者對上述語句同時執行屢次,針對重複量多的UnitPrice,GROUP BY總的處理效率比DISTINCT高一點點,可是針對重複量低的SalesOrderDetailID,DISTINCT就比GROUP BY快一點了,而若是隨着總體數據量的增長,效果會愈來愈明顯。

今天的內容就講到這裏,小夥伴能夠動手嘗試一下。若有不明白的能夠在下方留言一塊兒探討。

相關文章
相關標籤/搜索