由于ORDER BY子句,SQL查询性能不佳
我在WHERE子句中有一个连接4个表和很多条件的查询。查询还包括数字列上的ORDERBY子句。返回需要6秒,这太长了,我需要加快速度。令人惊讶的是,我发现如果删除ORDERBY子句需要2秒钟。为什么order by会产生如此巨大的差异,以及如何对其进行优化?我正在使用SQLServer2005。非常感谢 由于我正在清除执行计划缓存,因此无法确认ORDER BY是否会产生很大的差异。然而,你能解释一下如何加快速度吗?查询如下(为了简单起见,有“SELECT*”,但我只选择我需要的查询) 为什么order by会产生如此巨大的差异,以及如何对其进行优化 排序依据需要对结果集进行排序,如果结果集很大,可能需要很长时间 要对其进行优化,可能需要对表进行适当的索引 然而,索引访问路径有其缺点,因此可能需要更长的时间 如果查询中存在除等号联接以外的内容,或范围谓词(如由于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
或介于之间,或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