我的数据库服务器过去几天持续高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时间。 例如
它们不会出现在SQL事件探查器上。任何人都有想法他们应该做些什么以及应该做些什么呢?
答案 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
的任何迹象。