【发布时间】:2010-08-13 16:25:36
【问题描述】:
好的,这个普遍的问题在过去 6 个月里已经出现了两次丑陋的问题(不同的存储过程)。我们让内部用户在应用程序中报告超时错误。我们可以在受控环境中重现应用程序中的问题。因此,我们通过使用 sp_who2 检查阻塞的正常步骤。一切看起来都很好,没有阻塞。所以我们做一个 sql 跟踪来确切地查看该过程是如何执行的。我们将其复制到 SQL Management Studio 中的新窗口并执行 sql 跟踪告诉我们 ADO.Net 正在执行的操作,并在几毫秒内完成。我们的应用程序超时为 30 秒。当这个问题在几个月前发生时,我们有 SQL Server 2005。我们现在已经升级到 SQL Server 2008 R2。诊断此类问题的下一步是什么?
@Martin:感谢您的回复。我会详细阅读你的帖子,让你知道我发现了什么。在此之前,这是您请求的 SP 中的 sql:
Select
@Exists=0,
@EarnRecId=0,
@SuppStatusId = 0,
@SLRecId = 0,
@EarnRecDS = Null
Select
@EarnRecId = er.EarningsId,
@EarnRecDS = Convert(Varchar(26),er.Datestamp, 109),
@SuppStatusId = s.SuppStatusId,
@SLRecId = s.SLId
From
Tracking tr
Inner Join Supps s On s.SuppId = tr.SuppId
Inner Join Earnings er On er.EarnRecId = s.SuppId
Where
tr.ClaimId = @ClaimId
and er.FiscalYr = @FiscalYr
And er.EmplyrId In (@EmpId1,@EmpId2)
If @EarnRecId > 0
Begin
Set @Exists=1
End
【问题讨论】:
-
索引或统计数据是问题所在。由于某种原因,来自 ADO 的查询计划与直接在服务器上的查询计划不同。因此,请检查您的索引和统计信息。
-
为什么 ado.net 和 sql management studio 执行完全相同的存储过程会有所不同?要尝试缓解问题,只需更新统计信息和碎片整理索引?
-
@user - 不会有。当然,这两个调用都将使用相同的统计信息和索引,因此如果这是导致问题的原因,则两者都应该发生。几乎可以肯定是参数嗅探。现在不要重建索引/统计信息!这将导致计划从缓存中删除,并阻止任何确认这一点的尝试。你能发布查询吗?
-
我建议尝试以下方法。 (1) 确定最不常见和最常见的 ClaimId、FiscalYr 和 EmplyrId 值。 (2) 将最不常见的替换为一个版本的选择查询作为常量 (3) 对最常见的执行相同操作。 (4) 比较执行计划。顺便说一句,我有点不确定标量变量的赋值在哪里离开了我的理论。如果您要删除分配,结果是否只能保证返回一行?
-
不确定您是否意识到这一点,但您可以使用 SQL 分析器查看事件的执行计划。这可以帮助确定问题是否是 Martin 建议的参数嗅探。详情在这里:tinyurl.com/2xccjm
标签: sql-server performance stored-procedures