最近发布的一个网站碰到问题,求高手指导:
服务器环境:
【ASP.NET网站】Windows Server 2003+IIS6.0+SQL Server 2008
项目名称:ERPOA
【JSP网站】Apache Tomcat 5.5+SQL Server 2008(共用一个实例)
项目名称:SMIS
症状描述:ERPOA运行一段时间后(大约1天),访问速度变得非常慢,检测发现CPU使用率非常高(超过50%,最高达100%),重启SQL Server服务后,恢复正常。初步检测此正常状态可维持1天左右,在此期间,若有访问(无论是ERPOA还是SMIS)连接,则CPU使用率会提高至50%左右,关闭访问后恢复正常效率1%左右。
思考:
个人认为从两个方面着手:
(1)优化项目数据库访问性能
(2)找出导致CPU使用率居高不下的原因。
处理:
对于第(1)点,已使用SQL Profiler采集了跟踪数据,稍后将贴出部分截图。
对于第(2)点,目前还在查找,未有进展。
SQL Profiler数据分析:
(1)关于第1,3,4,5,6条记录不清楚是什么东西,希望你能给出意见。
(2)关于第2条是执行的一个库中定义的存储过程,已做优化,优化后测试数据如下:
(3)很明显,对视图V_Staff的查询是CPU消耗的关键因素。
上表中反映出来是SQL:BatchCompleted(EventClass=12)事件及SQL:StmtCompleted(EventClass=42)事件消耗CPU时间最多,估计这个是优化CPU使用率的关键因素。
V_Staff视图由基础信息表构建,不包含系统表。对V_Staff执行统计命令如下:
很明显,上述查询是读取缓存数据,速度很快。
也就是说不应该产生上面表中出现的高CPU时间消耗的问题,但是它确实又产生了,这该如何解释,又该如何做进一步测试或优化,求高手指导!
求高手指导!
求高手指导!
求高手指导!
求高手指导!
有了新进展,初步判断,可能是V_Staff视图进行了重编译,导致查询消耗CPU较大。
于是,仔细的梳理了一边ERPOA项目,发现每次登录之前修改用户信息表(登录时间等的记录),会导致V_Staff视图重编译,而此时由于系统待办任务对此视图的查询很频繁,因此产生了大消耗。
接下来,针对上面的分析,将登录时间的信息的记录独立出来,再次测试,发现系统性能有了较大的改善,测试视图如下表:
第一张表为改动前的检测数据,第二张表为改动后的监测数据,明显CPU消耗时间缩短了约2/3。
不过依然不理想SQL:BatchCompleted的消耗依然很大,需要进一步做优化,下图是按时间顺序查询的检测数据表:
从图中可以看出来,每次对V_Staff的查询都会捕获到两个事件:
(1)SQL:StmtCompleted=41 (Reads=12, CPU=0)
(2)SQL:BatchCompleted=12 (Reads=921,CPU=156)
由比较可以知道,第二个事件是消耗资源的罪魁祸首,不过我并不清楚SQL:BatchCompleted与SQL:StmtCompleted的差别在什么地方?
而SQL:BatchCompleted的资源消耗由该如何优化?
Duration 和CPU都好大
数据量很大?索引不正确?
第3,4两条命令看不清楚。图片模糊了
-----------------
还是贴出表结构和视图结构吧。
Recently, while evaluating the performance of a production system, I was alarmed by the ”SQLServer: Access Methods\ Page Splits/ sec” occuring in the system.
It turned out that if you have the ”Activity Monitor” on, then there is a SQL Statement running which executes ”EXEC #am_get_querystats”, with CPU about 967, Reads about 50000, Writes 646 and it refers to the tempdb.
So, what other counters is the Activity Monitor affecting?
--------------------
在你使用完成后,建议set statistics time off , and set statistics io off.
估计这个问题是引起你第3,4,5,6条问题的原因。
另外从你第7条数据开始,貌似实际读取出来的数据都不是很多。
但是CPU和Duration都很高,不知道具体SQL是什么
可以考虑优化SQL,索引,分拆,甚至更改表结构等等。
为了提高效率,可以考虑建立关系表和使用分区技术。
上执行计划看??