簡體   English   中英

由於ORDER BY子句導致SQL查詢性能不佳

[英]Bad performance of SQL query due to ORDER BY clause

我有一個查詢連接4個表,WHERE子句中有很多條件。 該查詢還包括數字列上的ORDER BY子句。 返回需要6秒,這太長了,我需要加快速度。 令人驚訝的是,我發現如果我刪除ORDER BY子句需要2秒鍾。 為什么訂單會產生如此巨大的差異以及如何優化它? 我正在使用SQL Server 2005.非常感謝。

由於我正在清除執行計划緩存,因此我無法確認ORDER BY有很大的不同。 但是,你能說明如何加快這一點嗎? 查詢如下(為簡單起見,有“SELECT *”,但我只選擇我需要的那些)。

SELECT *
FROM View_Product_Joined j 
INNER JOIN [dbo].[OPR_PriceLookup] pl on pl.siteID = NodeSiteID and pl.skuid = j.skuid 
LEFT JOIN [dbo].[OPR_InventoryRules] irp on irp.ID = pl.SkuID and irp.InventoryRulesType = 'Product'
LEFT JOIN [dbo].[OPR_InventoryRules] irs on irs.ID = pl.siteID and irs.InventoryRulesType = 'Store'
WHERE (((((SiteName = N'EcommerceSite') AND (Published = 1)) AND (DocumentCulture = N'en-GB')) AND (NodeAliasPath LIKE N'/Products/Cats/Computers/Computer-servers/%')) AND ((NodeSKUID IS NOT NULL) AND (SKUEnabled = 1) AND pl.PriceLookupID in (select TOP 1 PriceLookupID from OPR_PriceLookup pl2 where pl.skuid = pl2.skuid and (pl2.RoleID = -1 or pl2.RoleId = 13) order by pl2.RoleID desc))) 
ORDER BY NodeOrder ASC

為什么訂單會產生如此巨大的差異以及如何優化它?

ORDER BY需要對結果集進行排序,如果結果集很大則可能需要很長時間。

要優化它,您可能需要正確索引表。

但是,索引訪問路徑有其缺點,因此甚至可能需要更長時間。

如果在查詢中有除equijoins之外的其他內容,或者有遠程謂詞(如<>BETWEENGROUP BY子句),則用於ORDER BY的索引可能會阻止使用其他索引。

如果您發布查詢,我可能會告訴您如何優化它。

更新:

重寫查詢:

SELECT  *
FROM    View_Product_Joined j 
LEFT JOIN
        [dbo].[OPR_InventoryRules] irp
ON      irp.ID = j.skuid
        AND irp.InventoryRulesType = 'Product'
LEFT JOIN
        [dbo].[OPR_InventoryRules] irs
ON      irs.ID = j.NodeSiteID
        AND irs.InventoryRulesType = 'Store'
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    OPR_PriceLookup pl
        WHERE   pl.siteID = j.NodeSiteID
                AND pl.skuid = j.skuid
                AND pl.RoleID IN (-1, 13)
        ORDER BY
                pl.RoleID desc
        ) pl
WHERE   SiteName = N'EcommerceSite'
        AND Published = 1
        AND DocumentCulture = N'en-GB'
        AND NodeAliasPath LIKE N'/Products/Cats/Computers/Computer-servers/%'
        AND NodeSKUID IS NOT NULL
        AND SKUEnabled = 1
ORDER BY
        NodeOrder ASC

顧名思義,關系View_Product_Joined可能是一個視圖。

你可以發表它的定義嗎?

如果它是可索引的,您可以從View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder)上創建索引中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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