优化存储过程以获得更好的性能[关闭]
Posted
技术标签:
【中文标题】优化存储过程以获得更好的性能[关闭]【英文标题】:Optimising stored procedure for better performance [closed] 【发布时间】:2012-01-18 17:20:01 【问题描述】:我正在使用大约需要一分钟才能执行的 SP;任何优化的想法?我使用的索引是accessCodeID
,数据量在20k左右,
SELECT COUNT(tbAC.abGUID) AS total,
tbAC.abGUID,
tbAC.aVID,
tb_tt.used,
FROM tbAC
INNER JOIN (SELECT COUNT(abGUID) AS used,
abGUID
FROM tbAC AS tbAC_1
WHERE ( batchGUID = @id )
AND ( aVID > 0 )
AND ( isVoided = 0 )
AND ( isCodeUsed = 1 )
GROUP BY abGUID) AS tb_tt
ON tbAC.abGUID = tb_tt.abGUID
INNER JOIN tbV
ON tbAC.aVID = tbV.vendorID
WHERE ( tbAC.aVID > 0 )
AND ( tbAC.batchGUID = @id )
AND ( tbAC.isVoided = 0 )
AND ( lowLevelNotified = 0 )
GROUP BY tbAC.abGUID,
tbAC.aVID,
tb_tt.used,
tbV.name,
tbV.firstName,
tbV.lastName,
tbV.tel,
tbV.email,
tbV.contactName
【问题讨论】:
您必须提供更多信息,例如:表架构信息、现有索引、数据量,最好是查询计划。 请用信息编辑您的帖子,而不是在 cmets 中添加信息:) -1。投票关闭。如果您认为我们正在读懂您的想法,并且无法提供必要的信息来理解这一点 - 请尝试在麦当劳工作。至少发布您的硬件配置、查询执行计划和表定义。 我不明白这里的敌意,A 先生。虽然我们不能告诉你如何准确地解决这个问题,但我们当然可以就如何着手研究和解决它给你建议。 我要求的是建议而不是答案,因为我的查询有效,但它只是执行所需的时间,所以我正在寻找任何可以提高 d 查询性能的建议。跨度> 【参考方案1】:这是我建议您尝试的一种方法。
在 Management Studio 中检查执行计划。 这将向您显示消耗最多时间和资源的地方。然后,您将知道,例如,您可能需要在表中添加索引的位置。
我将分别检查这两个查询。从嵌套查询开始。自行优化。然后,尝试在没有内部查询的情况下进行外部查询。然后,将它们放在一起。
如果您是视频爱好者,您可能会从this short one 以及那里引用的其他人那里获得一些帮助。
一旦您知道您正在寻找“执行计划”,您就可以在 Google 上搜索大量内容,并在 SO 中找到很多好问题。这是我为初学者找到的twoarticles。
【讨论】:
【参考方案2】:假设allocatedVendorID在功能上依赖于abGUID,试试:
SELECT sum(case when lowLevelNotified = 0 then 1 else 0 end) AS total,
tbAccessCode.abGUID,
tbAccessCode.allocatedVendorID,
sum(case when isCodeUsed = 1 then 1 else 0 end) AS used,
tbV.name,
tbV.firstName,
tbV.lastName,
tbV.tel,
tbV.email,
tbV.contactName
FROM tbAccessCode
INNER JOIN tbV
ON tbAccessCode.allocatedVendorID = tbV.vendorID
WHERE ( tbAccessCode.allocatedVendorID > 0 )
AND ( tbAccessCode.batchGUID = 'abc-def' )
AND ( tbAccessCode.isVoided = 0 )
GROUP BY tbAccessCode.abGUID,
tbAccessCode.allocatedVendorID,
tbV.name,
tbV.firstName,
tbV.lastName,
tbV.tel,
tbV.email,
tbV.contactName
【讨论】:
total 和 used columns 显示相同的结果 这很奇怪 - 你可以看到逻辑不同。它与旧查询的结果相比如何?如果添加 count(*) 列,将返回哪些数字?您可以在问题中添加一些示例数据吗? 我试过计数但没有区别,使用的显示正确的数量,但我想总数存在问题,因为它显示的数字与使用的数字相同 它与原始查询的输出相比如何? 它返回 36 行,而原来的返回 32 行,额外的 4 行是总 = 0 的那一行,它不在原始查询中,在问题中添加了图像以上是关于优化存储过程以获得更好的性能[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何删除 MS SQL Server 存储过程中的 While 循环? [关闭]