狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

SQL優(yōu)化:使用正確的去重方法

admin
2025年6月21日 23:59 本文熱度 74

上一講我們使用DISTINCT來去掉重復(fù)行以提高查詢效率,這和小伙伴們平常聽到的一條優(yōu)化建議:盡量少使用DISTINCT相悖。下面我們來看看DISTINCT到底該不該使用。如果不想看處理過程的可以直接跳到紅色結(jié)論部分。


1.使用DISTINCT去掉重復(fù)數(shù)據(jù)

我們重復(fù)一下上一講的例子:

SELECTDISTINCT UnitPrice 
FROM [Sales].[SalesOrderDetail] 
WHERE UnitPrice>1000;

執(zhí)行完之后的結(jié)果如下:

接下來,我們將這個(gè)表里的數(shù)據(jù)增大到194萬條,再重復(fù)上面的實(shí)驗(yàn)。

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

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

--通過新增的物理表進(jìn)行自循環(huán)插入3次,將數(shù)據(jù)增加到1941072行

DECLARE @i INT;
SET @i=0
WHILE @i<4
BEGIN
--這里沒有將SalesOrderDetailID這個(gè)自增長的放在列中,是為了讓系統(tǒng)自動(dòng)填充不同的數(shù)字進(jìn)去,保證唯一性。
INSERTINTO 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;

SELECTCOUNT(1FROM Sales.Temp_SalesOrder;

(提示:可以左右滑動(dòng)代碼)

將SalesOrderDetailID的自增長屬性取消掉之后,插入1000條自身的數(shù)據(jù),這樣我們就可以得到1000條重復(fù)的SalesOrderDetailID,相比1942072條記錄占比很小了

如下圖,將自增長標(biāo)識(shí)的換成后即可插入了。

INSERTINTO sales.Temp_Salesorder
SELECT TOP 1000 * FROM sales.Temp_Salesorder;

數(shù)據(jù)插入完整后,我們在將上一講的內(nèi)容重復(fù)一下,看看效果如何?


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

SELECT UnitPrice FROM Sales.Temp_SalesOrder ;

我們看一下執(zhí)行情況:

接下來是鑒證奇跡的時(shí)刻了,我們加DISTINCT在UnitPrice前面試試

SELECT  DISTINCT  UnitPrice FROM sales.Temp_Salesorder;


和之前的實(shí)驗(yàn)結(jié)果一致,在執(zhí)行時(shí)間沒有多大差別的情況下,分析時(shí)間成倍的減少了。


B.當(dāng)SalesOrderDetailID取消掉自增長屬性后就和普通列一樣了。

我們來重復(fù)上面的步驟:


SELECT   SalesOrderDetailID FROM sales.Temp_Salesorder

執(zhí)行完后結(jié)果如下:

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

然后我們給SalesOrderDetailID加上DISTINCT后會(huì)怎么樣呢?

SELECTDISTINCT  SalesOrderDetailID 
FROM sales.Temp_Salesorder

我們可以看到如下執(zhí)行情況:

從上圖可以看到,DISTINCT已經(jīng)排除了1000條記錄,但是在執(zhí)行時(shí)花的時(shí)間比沒加DISTINCT更久了。

通過上述兩個(gè)實(shí)驗(yàn),我們可以得出這樣一條結(jié)論:在重復(fù)量比較高的表中,使用DISTINCT可以有效提高查詢效率,而在重復(fù)量比較低的表中,使用DISTINCT會(huì)嚴(yán)重降低查詢效率。所以并不是所有的DISTINCT都是降低效率的,當(dāng)然你得提前判斷數(shù)據(jù)的重復(fù)量。


2.GROUP BY與DISTINCT去掉重復(fù)數(shù)據(jù)的對比

GROUP BY與DISTINCT類似,經(jīng)常會(huì)有一些針對這兩個(gè)哪個(gè)效率高的爭議,今天我們就將這兩個(gè)在不同重復(fù)數(shù)據(jù)量的效率作下對比。

A.重復(fù)數(shù)據(jù)量多的情況下,對UnitPrice進(jìn)行去重

SELECT  DISTINCT  UnitPrice FROM sales.Temp_Salesorder;
SELECT  UnitPrice FROM sales.Temp_Salesorder GROUPBY UnitPrice;

將上述兩條語句一起執(zhí)行,結(jié)果如下:


可以看出兩條語句對應(yīng)的執(zhí)行時(shí)間GROUP BY比DISTINCT效率高一點(diǎn)點(diǎn)。


B.重復(fù)數(shù)據(jù)量少的情況下,對SalesOrderDetailID進(jìn)行去重

SELECT  DISTINCT SalesOrderDetailID FROM sales.Temp_Salesorder
SELECT   SalesOrderDetailID FROM sales.Temp_Salesorder 
GROUPBY SalesOrderDetailID


也是同時(shí)執(zhí)行上述兩條語句,其結(jié)果如下:


作者對上述語句同時(shí)執(zhí)行多次,針對重復(fù)量多的UnitPrice,GROUP BY總的處理效率比DISTINCT高一點(diǎn)點(diǎn),但是針對重復(fù)量低的SalesOrderDetailID,DISTINCT就比GROUP BY快一點(diǎn)了,而如果隨著整體數(shù)據(jù)量的增加,效果會(huì)越來越明顯。

今天的課就講到這里,小伙伴可以動(dòng)手嘗試一下。


——End——


閱讀原文:原文鏈接


該文章在 2025/6/23 12:56:52 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved