SQL專欄面試
SQL基礎知識彙總markdown
SQL高級知識彙總ide
咱們知道DISTINCT能夠去掉重複數據,GROUP BY在分組後也會去掉重複數據,那這兩個關鍵字在去掉重複數據時的效率,究竟誰會更高一點?ui
1.使用DISTINCT去掉重複數據
咱們先看下面這個例子:3d
SELECT DISTINCT UnitPrice FROM [Sales].[SalesOrderDetail] WHERE UnitPrice>1000;
執行完以後的結果以下:code
接下來,咱們將這個表裏的數據增大到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
INSERT INTO sales.Temp_Salesorder SELECT TOP 1000 * FROM sales.Temp_Salesorder;
數據插入完整後,咱們在將上一講的內容重複一下,看看效果如何?
A.在沒建索引的狀況下,咱們只查詢UnitPrice這一列
SELECT UnitPrice FROM Sales.Temp_SalesOrder ;
咱們看一下執行狀況:
接下來是鑑證奇蹟的時刻了,咱們加DISTINCT在UnitPrice前面試試
SELECT DISTINCT UnitPrice FROM sales.Temp_Salesorder;
和以前的實驗結果一致,在執行時間沒有多大差異的狀況下,分析時間成倍的減小了。
B.當SalesOrderDetailID取消掉自增加屬性後就和普通列同樣了。
咱們來重複上面的步驟:
SELECT SalesOrderDetailID FROM sales.Temp_Salesorder
執行完後結果以下:
與上面的UnitPrice沒使用DISTINCT狀況基本一致。
而後咱們給SalesOrderDetailID加上DISTINCT後會怎麼樣呢?
SELECT DISTINCT SalesOrderDetailID FROM sales.Temp_Salesorder
咱們能夠看到以下執行狀況:
從上圖能夠看到,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;
將上述兩條語句一塊兒執行,結果以下:
能夠看出兩條語句對應的執行時間GROUP BY比DISTINCT效率高一點點。
B.重複數據量少的狀況下,對SalesOrderDetailID進行去重
SELECT DISTINCT SalesOrderDetailID FROM sales.Temp_Salesorder
SELECT SalesOrderDetailID FROM sales.Temp_Salesorder
GROUP BY SalesOrderDetailID
也是同時執行上述兩條語句,其結果以下:
做者對上述語句同時執行屢次,針對重複量多的UnitPrice,GROUP BY總的處理效率比DISTINCT高一點點,可是針對重複量低的SalesOrderDetailID,DISTINCT就比GROUP BY快一點了,而若是隨着總體數據量的增長,效果會愈來愈明顯。
今天的內容就講到這裏,小夥伴能夠動手嘗試一下。若有不明白的能夠在下方留言一塊兒探討。