0

我正在尝试解决数据库服务器上 SQL Server 进程使用 100% cpu 的问题。在调查时,我现在发现存储过程占用了最多的工作时间。

对于 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、读取、持续时间的查询时,存储过程并没有排在顶部。

为什么会发生这种情况?

==编辑== 应用程序实际上使用的即席查询比存储过程更多。其中一些过程将迁移到使用即席查询。问题是这些过程不像其他一些查询那样经常被调用,这些查询是 CPU 密集型的,并且被非常频繁地调用。此外,让我感到奇怪的是,一个从 tbl where id=@id 执行简单选择 a,b,c 的存储过程将比具有多个连接的查询具有更高的总工作时间,用户定义的函数在 where子句,一个排序和一个row_number,而简单的查询一个包含20000条记录的表,而复杂的查询是一个超过200,000条记录的表。

4

1 回答 1

1

这取决于您在该存储过程中做什么,如何调整表、索引等。

例如,如果您使用诸如 cursor 之类的循环创建存储过程,您将拥有最大的 cpu 使用率。如果您没有设置索引并且您正在使用 select 使用不同的连接等。你会让你的cpu超载。

这与您使用数据库的方式有关。

一些技巧:

  1. 我建议大多数时候创建存储过程。
  2. 创建存储过程时,使用执行计划运行以获得一些建议。
  3. 如果表有很多记录(超过 1 或 2 百万),请考虑创建索引视图。
  4. 仅在必要时进行更新或删除,有时最好只插入记录并每天或每周运行一个作业来更新或删除您不需要的记录。(视情况而定)
于 2012-04-04T19:16:22.357 回答