我想解决数据库服务器上的SQL Server进程100%CPU使用率。在调查过程中,我现在已经发现存储过程占用大部分工作时间的事实。存储过程吃CPU SQL Server 2005
对于DMV的以下查询查找查询取最高的时间,
SELECT TOP 20 st.text
,st.dbid
,st.objectid
,qs.total_worker_time
,qs.last_worker_time
,qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_worker_time DESC
大部分都是存储过程。奇怪的是,所有这些存储过程都在查询不同的表。然而,尽管当我查看Profiler查询具有最高CPU的查询,持续时间时,他们是占用大部分工作时间的首选,但存储过程并不在顶部。
为什么会发生这种情况?
==编辑== 应用程序实际上使用adhoc查询而不是存储过程。其中一些程序将被迁移到使用adhoc查询。问题在于这些过程不像其他一些查询那样频繁调用,这些查询是cpu密集型的,并且非常频繁地被调用。 此外,它确实让我奇怪的是,一个存储过程用tbl做了一个简单的select a,b,c,其中id = @ id的工作时间总和要高于具有多重连接的查询, where子句,排序和row_number,而简单的查询有20000条记录的表,复杂查询位于具有超过200,000条记录的表上。
所有这些告诉我的是,您的应用程序被编码为使用存储过程访问数据库而不是特别查询。这不是一件坏事。有很多其他因素可能会导致服务器CPU被挂起。没有足够的动力来满足需求?这是所有的时候还是在使用高峰期?索引适当?等等等等...... – Yuck 2012-04-04 19:02:56
'total_worker_time'当然是累积的,而profiler显示个别执行的数字。也许这些只是非常频繁地执行。 – 2012-04-04 19:04:15
@yuck增加了一些信息。我知道,为什么cpu使用率达到100%的原因可能有很多,但即使在低负载情况下,它的使用率也达到了100%。一直在调整/ defraging索引等 – shashi 2012-04-04 20:12:11