簡體   English   中英

如何通過 SQL 查詢提高訂單性能

[英]How to improve performance of order by SQL query

我有一個 SQL 服務器數據庫,其中包含表ProductProductSpecificationProductRetailer 為了收集查詢所需的所有信息,我運行以下命令

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM