0

我有一个客户端应用程序正在向 SQL Server 2005 提交以下命令。在一天中的特定时间,我们遇到了性能问题,当标准低于 300 毫秒时,一些请求需要 2 到 8 秒才能运行。我们正在研究 SQL Server 选项以及可能影响服务器的所有外部变量。

我的问题是一个请求如何/为什么需要 8 秒,在此期间,许多其他相同的请求在这 8 秒的窗口中开始和完成?什么可以阻止 8 秒通话完成,但不能阻止或减慢其他通话?

在此期间运行服务器分析器,读取次数约为 20 次,并且所有(长时间和短期)调用的写入次数少于 5。

插入的表有大约 22M 条记录。我们保留了大约 30 天的数据。我们可能会改变每天归档这些数据的方法,并保持每日插入表小且无索引,但真的想了解这里发生了什么。

  • 此表上没有触发器。
  • GUID、Time 和 WebServerName 有 3 个索引(没有一个是集群的)

这是正在提交的命令:

exec sp_executesql N'Insert Into WebSvcLog_Duration (guid,time,webservername,systemidentity,useridentity,metricname,details,duration,eventtype)values(@guid,@time,@webservername,@systemidentity,@useridentity,@metricname,@details,@duration,@eventtype)',N'@guid nvarchar(36),@time datetime,@webservername nvarchar(10),@systemidentity nvarchar(10),@useridentity nvarchar(8),@metricname nvarchar(5),@details nvarchar(101),@duration float,@eventtype int',@guid=N'...',@time='...',@webservername=N'...',@systemidentity=N'...',@useridentity=N'...',@metricname=N'...',@details=N'...',@duration=0.0,@eventtype=1
4

1 回答 1

0

可能的原因是堆碎片;你没有提到你是否正在进行某种索引维护,所以我假设它不存在。最小化碎片的最佳方法是在单调值(具有自然递增顺序的列)上构建聚集索引。我不确定时间列应该代表什么,但如果是插入时间,那么它可能是聚集索引的一个很好的候选者;如果没有,那么我会添加一个列来捕获插入到表中的时间并在其上构建一个聚集索引。

于 2014-03-11T17:05:03.803 回答