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

由于ORDER BY子句,SQL查询性能不佳,sql,sql-server,sql-server-2005,performance,Sql,Sql Server,Sql Server 2005,Performance,我在WHERE子句中有一个连接4个表和很多条件的查询。查询还包括数字列上的ORDERBY子句。返回需要6秒,这太长了,我需要加快速度。令人惊讶的是,我发现如果删除ORDERBY子句需要2秒钟。为什么order by会产生如此巨大的差异,以及如何对其进行优化?我正在使用SQLServer2005。非常感谢 由于我正在清除执行计划缓存,因此无法确认ORDER BY是否会产生很大的差异。然而,你能解释一下如何加快速度吗?查询如下(为了简单起见,有“SELECT*”,但我只选择我需要的查询) 为什么or

我在WHERE子句中有一个连接4个表和很多条件的查询。查询还包括数字列上的ORDERBY子句。返回需要6秒,这太长了,我需要加快速度。令人惊讶的是,我发现如果删除ORDERBY子句需要2秒钟。为什么order by会产生如此巨大的差异,以及如何对其进行优化?我正在使用SQLServer2005。非常感谢

由于我正在清除执行计划缓存,因此无法确认ORDER BY是否会产生很大的差异。然而,你能解释一下如何加快速度吗?查询如下(为了简单起见,有“SELECT*”,但我只选择我需要的查询)

为什么order by会产生如此巨大的差异,以及如何对其进行优化

排序依据需要对结果集进行排序,如果结果集很大,可能需要很长时间

要对其进行优化,可能需要对表进行适当的索引

然而,索引访问路径有其缺点,因此可能需要更长的时间

如果查询中存在除等号联接以外的内容,或范围谓词(如
介于
之间,或
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
顾名思义,视图与产品的关系可能是一种视图

你能把它的定义贴出来吗


如果它是可索引的,您可能会受益于在
View\u Product\u Joined(SiteName、Published、DocumentCulture、skueenabled、NodeOrder)

上创建索引。您看过查询计划了吗?尝试为您在ORDER BY子句中使用的列编制索引(如果还没有,也就是说)另外,请确保在每次测试之间清除数据/执行计划缓存,否则可能会得到不正确的结果(最坏的情况是,它们实际上执行相同的操作,但第二个在从缓存中获取数据时运行得更快)。您实际上没有在生产代码中使用select*,是吗?您有连接,所以您至少要发送重复的数据,这只会浪费网络和服务器资源。永远不要选择超出实际需要的列,也不要从多个表中选择连接的列。除了索引建议之外,另一个会严重影响性能的因素是数据类型。按整数排序应该比按日期排序快得多,甚至比按varchar排序更快。为了执行查询,我必须添加skuID和siteID作为交叉应用查询的输出,并为其指定别名。它现在速度快得多,但也返回了约40%的记录。将需要进一步调查。
@David
:我对查询进行了一些更正,请查看更新后的内容。
OPR\u PriceLookup
上的
PriceLookupID
是一个
主键
吗?我让它工作了,而且速度快得多。了解交叉申请很好。非常感谢!
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