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