2012-04-04 183 views
0

我想解决数据库服务器上的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条记录的表上。

+0

所有这些告诉我的是,您的应用程序被编码为使用存储过程访问数据库而不是特别查询。这不是一件坏事。有很多其他因素可能会导致服务器CPU被挂起。没有足够的动力来满足需求?这是所有的时候还是在使用高峰期?索引适当?等等等等...... – Yuck 2012-04-04 19:02:56

+2

'total_worker_time'当然是累积的,而profiler显示个别执行的数字。也许这些只是非常频繁地执行。 – 2012-04-04 19:04:15

+0

@yuck增加了一些信息。我知道,为什么cpu使用率达到100%的原因可能有很多,但即使在低负载情况下,它的使用率也达到了100%。一直在调整/ defraging索引等 – shashi 2012-04-04 20:12:11

回答

1

这取决于你在该存储过程做什么,你是如何调整你的表,索引等

例如,如果您创建使用循环光标一样的存储过程,你将有最大CPU使用率。如果你没有设置你的索引,并且你正在使用select来使用不同的连接等。你会让你的CPU过载。

这是你如何使用你的数据库。

一些提示:

  1. 我建议创建的大部分时间存储过程。
  2. 当您创建存储过程时,请使用执行计划运行以获取一些建议。
  3. 如果表中有很多记录(超过1或2百万),请考虑创建索引视图。
  4. 仅在必要时进行更新或删除,有时候最好只插入记录并每天或每周运行一项作业以更新或删除不需要的记录。 (这取决于具体情况)