2011-12-10 3 views
3

DB 서버가 지난 며칠 동안 CPU로드가 계속 높아지고 있습니다. 이 조사하는 동안, 나는 대부분의 시간에 나는 떨어져 응용 프로그램 서버에서 전송되는 일반 쿼리에서 소비하는 것 같다 이상한 S 쿼리가있는 것을 알게 쿼리DB 서버에서 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' 전체를 캡쳐 해보십시오. 확실히 당신의'substring' 코드가 잘못되었을 것으로 확신합니다. –

+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을 반환 할 때의 표시를 찾을 수 없습니다.