[英]How to improve performance of order by SQL query
我有一個 SQL 服務器數據庫,其中包含表Product
、 ProductSpecification
和ProductRetailer
。 為了收集查詢所需的所有信息,我運行以下命令
SELECT
pr.ProductId AS Id, p.Name, p.Category, p.Code, ps.Material,
p.Brand, ps.Collection, ps.Colour, ps.SubCollection, ps.SurfaceType,
MIN(pr.Price) AS LowestPrice, p.ImageUrl, COUNT(pr.Price) AS DealCount
FROM
dbo.ProductRetailer AS pr
INNER JOIN
dbo.Product AS p ON p.Id = pr.ProductId
INNER JOIN
dbo.ProductSpecification AS ps ON p.Id = ps.ProductId
GROUP BY
pr.ProductId, p.Name, p.Category, p.Code, ps.Material, p.Brand,
ps.Collection, ps.Colour, ps.SubCollection, ps.SurfaceType, p.ImageUrl
在很多情況下我想按最低價格訂購,但是盡管只有不到 2000 條記錄,但我發現查詢最多需要 45 秒。 使用 order by 時有什么方法可以提高此查詢的速度嗎?
附上執行計划https://www.brentozar.com/pastetheplan/?id=Sy0eWEvN _
設置統計 IO ON OUTPUT
(受影響的 1047 行)表“工作表”。 掃描計數 0,邏輯讀取 0,物理讀取 0,預讀讀取 184,lob 邏輯讀取 0,lob 物理讀取 0,lob 預讀讀取 0。表“ProductRetailer”。 掃描計數 1064,邏輯讀取 2332,物理讀取 7,預讀讀取 1,lob 邏輯讀取 0,lob 物理讀取 0,lob 預讀讀取 0。表“ProductSpecification”。 掃描計數 0,邏輯讀取 4998,物理讀取 20,預讀讀取 9,lob 邏輯讀取 0,lob 物理讀取 0,lob 預讀讀取 0。表“產品”。 掃描計數 1,邏輯讀取 368,物理讀取 56,預讀讀取 313,lob 邏輯讀取 0,lob 物理讀取 0,lob 預讀讀取 0。
(受影響的 1 行)
完成時間:2021-03-23T09:17:26.7989169+00:00
您可以按如下方式重新編寫查詢,以消除按所有列分組並使用apply()
聚合的需要
這可能會為您提供更好的執行計划,但是如果沒有看到您的實際計划和表上的索引策略,就很難確定。
select pr.ProductId as Id, p.[Name], p.Category, p.Code,
ps.Material, p.Brand, ps.[Collection],
ps.Colour, ps.SubCollection, ps.SurfaceType,
pr.LowestPrice, p.ImageUrl, pr.DealCount
from dbo.Product as p
join dbo.ProductSpecification as ps on ps.ProductId = p.Id
outer apply (
select Min(pr.Price) as LowestPrice, Count(pr.Price) as DealCount
from dbo.ProductRetailer as pr
group by pr.ProductId
where pr.ProductId = p.Id
)pr
編輯
您的問題的答案在您的執行計划中。
查詢讀取的數據量很小,只有60兆。 該計划的sort
運算符僅對少數幾行溢出到磁盤,這表明它沒有收到足夠高的 memory 授權。
整個查詢只獲得了512K,計划告訴你為什么花了這么長時間。 實際查詢耗時 4 秒,請參閱下面計划中的 SSMS output。
您的 SQL 服務器處於 memory 壓力下,僅此一項就等待了 25 秒。 授予 memory 的默認最小值為 1024k,但您的查詢僅收到 512k。 這表明有人一直在擺弄他們不理解的設置:)
您可以嘗試創建臨時表(這將具有您的內部連接的結果),然后對臨時表進行排序。
您的查詢不應該在幾千條記錄上花費 45 秒。
您想要的第一件事是在join
中使用的列的索引:
ProductRetailer(productid, price)
ProductSpecification(productid)
可能還有其他方法可以提高查詢效率,但這是開始的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.