由于ORDER BY子句导致SQL查询性能不佳

Dav*_*vid 7 sql sql-server performance sql-server-2005

我有一个查询连接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
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 8

为什么订单会产生如此巨大的差异以及如何优化它?

ORDER BY需要进行排序,如果是大可能需要很长时间的结果集.

要优化它,您可能需要正确索引表.

但是,索引访问路径有其缺点,因此甚至可能需要更长时间.

如果在查询中有除equijoins以外的东西,或者有远程谓词(如<,>BETWEEN,或GROUP 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
Run Code Online (Sandbox Code Playgroud)

View_Product_Joined顾名思义,这种关系可能就是一种观点.

你可以发表它的定义吗?

如果它是可索引的,您可以从创建索引中受益View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder).