안녕하세요.
쿼리 과부하 체크와 관련하여 질문이 있어 글을 올립니다.
현재 쿼리 CPU 과부하를 알아보기 위해 DMVs 를 통해
(total_worker_time/excecutoin/1000) 구문으로 확인하고 있는데요.
예를 들어 임의로 과부하가 많이 걸리는 쿼리를 두개 동시에 돌릴 경우
(A) 쿼리 값은 CPU 사용률 50%
(B) 쿼리 값은 CPU 사용률 60%
위와 같이 나왔다고 가정할 경우
위 값은 일반적으로 생각하는 sqlservr.exe의 cpu사용률과는 거리가 멀다고 생각해야 되는건지요~?
또한 각 A,B의 사용률은 110% 가 되는데, 각 쿼리별 CPU 사용률을 따로 봐야 하는건가요~?
기본적인 개념이 부족하여 드리는 기초적인 질문이라
양해를 드리며 글을 살포시 올려봅니다.
읽어주셔서 감사합니다.
-----------현재 과부하 쿼리 확인을 위해 AVG CPU Time을 가져오기 위해 하단의 쿼리를 사용중입니다.----------------
SELECT TOP 10
qs.last_execution_time
,qs.total_worker_time
,qs.execution_count
,REPLACE(CONVERT(VARCHAR(20), CONVERT(MONEY,qs.total_worker_time / qs.execution_count/1000),1),'.00','') as [Avg CPU Time(ms)]
,qs.execution_count
,substring (qt.text,
qs.statement_start_offset/2+1,
(case when qs.statement_end_offset = -1 then len (convert (nvarchar(max), qt.text)) * 2
else qs.statement_end_offset end - qs.statement_start_offset)/2) as query_text
,qt.dbid
,sd.name
,qt.objectid
,qt.number
,qt.encrypted
,qt.text
,sr.session_id
,sr.command
,sr.status
,sr.last_wait_type
,sr.wait_resource
,sq.query_plan
,fs.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) as sq
LEFT OUTER JOIN sys.databases as sd on qt.dbid = sd.database_id
LEFT OUTER JOIN sys.dm_exec_requests as sr on qs.sql_handle = sr.sql_handle
OUTER APPLY sys.fn_get_sql(sr.sql_handle) AS fs
ORDER BY qs.total_worker_time / qs.execution_count DESC
GO
Comment 4
-
향지
2013.12.04 13:48
-
dontcryme
2013.12.04 13:56
답변 감사드립니다.
(cpu률을 확인하기 위해 사용한 쿼리는 본문에 추가하였습니다.)
현재 해당 과부하 되는 쿼리들은 튜닝을 작업하면 되긴 하는데...
튜닝하기전에 상기 Cpu avg time을 통해 가져온 % 률을 가지고 몇 %이상 사용중이면
몇 %이하가 나와야 정상이다...라는 판단 혹은
상기 가정된 (1), (2) 와 같은 쿼리를 동시에 돌렸을 경우 나오는 각각의 쿼리 CPU Avg Time은
100% 기준 별개의 % 률로 보고 판단을 해야하는건지 확립이 잘 서지 않아서요.
그리고 이 DMVs 를 통해 구한 %률은...sqlservr.exe 프로세스의 cpu와는 별개의 점유율 같은데....
맞는건지요~?
(답변주셔서 감사합니다.)
-
향지
2013.12.04 18:34
[Avg CPU Time(ms)]
이부분은 사용율이 아니고
해당 쿼리의 평균 CPU 작업 시간을 밀리세컨드로 표시한것입니다.
-
dontcryme
2013.12.05 08:15
소중한 답변 감사드립니다.^^
현재 사용중인 SQL Server 2005의 쿼리들을 튜닝하여 성능을 좀 올리려는 작업중에
sqlservr.exe 사용률은 거의 0~3%에 가깝고, 상기 쿼리를 이용한 cpu 비용이 높은 쿼리들을 뽑는중에
특정 쿼리몇개가 cpu 비용이 50%이상인 경우에도 특별히 sqlservr.exe 프로세스의 cpu사용률은 증가되지 않아
연관 관계가 궁금하여 질문을 올렸습니다.
많이 공부해야겠네요
^^
낯익은 컬럼명이 있는걸로 봐서 sys.dm_exec_query_stats 이쪽걸 가지고 한것 같은데.....
CPU 과부하 전체 쿼리를 주시면 조금 도움을 드릴 수 있을것 같습니다.