在DB服务器上查询消耗CPU

时间:2011-12-10 22:03:31

标签: sql-server sql-server-2005

我的数据库服务器过去几天持续高CPU负载。在研究这个时,我正在使用查询

查看当前正在执行的请求
SELECT session_id,
       request_id,
       Db_name(database_id),
       start_time,
       status,
       command,
       Substring(txt.TEXT, ( statement_start_offset / 2 ) + 1,
       ( ( CASE statement_end_offset
       WHEN -1 THEN Datalength(txt.TEXT)
       ELSE statement_end_offset
                                                                   END
           - statement_start_offset ) / 2 ) + 1) AS statement_text,
       wait_type,
       wait_time,
       blocking_session_id,
       percent_complete,
       cpu_time,
       reads,
       writes,
       logical_reads,
       row_count
FROM   sys.dm_exec_requests
       CROSS APPLY sys.Dm_exec_sql_text([sql_handle]) AS txt
WHERE  session_id <> @@SPID
       AND session_id > 50 

大多数时候我发现除了应用服务器发送的常规查询之外,还有一些奇怪的S查询似乎占用了相当多的CPU时间。 例如

Screen shot from query analyzer I took yesterday for the above query

它们不会出现在SQL事件探查器上。任何人都有想法他们应该做些什么以及应该做些什么呢?

1 个答案:

答案 0 :(得分:2)

我的猜测是,如果您捕获整个txt.text以及statement_start_offset statement_end_offset,您会发现在某些情况下,偏移列可能都变成{ {1}}所以显示的0正在截断,只显示statement_text查询的第一个字符。

SELECT

我找不到DECLARE @text nvarchar(max); SET @text = 'SELECT .....'; DECLARE @statement_start_offset INT; SET @statement_start_offset = 0; DECLARE @statement_end_offset INT; SET @statement_end_offset = 0; SELECT Substring(@text, ( @statement_start_offset / 2 ) + 1, ( ( CASE @statement_end_offset WHEN -1 THEN Datalength(@text) ELSE @statement_end_offset END - @statement_start_offset ) / 2 ) + 1) AS statement_text 何时会返回statement_end_offset而不是0的任何迹象。