2011-12-10 36 views
3

过去几天我的数据库服务器的CPU负载持续很高。在调查这个问题,我一直在寻找在目前执行的请求使用查询在数据库服务器上使用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 

大多数时候,我发现,除了从应用服务器发送的常规查询,也有这似乎是消费这些怪异的小号查询一小部分CPU时间。 例如

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

它们不会出现在SQL事件探查器。任何人都有想法他们是什么以及应该怎样处理他们?

+0

命令列告诉它它是一个SELECT语句。但看看Statement_Text栏 - 它只是说S.没有别的。然后看看cpu_time,logical_reads等等。这个S似乎并没有出现在SQL分析器中。我想知道如何进一步调试。 – shashi

+3

尝试捕获整个'txt.text'。很确定你的'子串'代码会被证明是错误的。 –

+0

我使用Derek Dieter的sp_who3进行此类调查。你的子串代码与他有点不同。 :http://sqlserverplanet.com/dmv-queries/a-better-sp_who2-using-dmvs-sp_who3/ – brian

回答

2

我的猜测是,如果你有statement_start_offsetstatement_end_offset一起捕捉整个的txt.text,你会发现,有一些情况下,当偏置列既可以变成是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而不是-1虽然任何指示。

相关问题