SQL Server를 방해하는 요소를 확인하려면 어떻게 해야 합니까?
오늘 대부분의 시간 동안 SQL 서버 CPU는 약 90%였습니다.
지속적으로 사용 중이라 재가동할 수 없는 상황입니다.
SQL 내에서 무엇이 이러한 CPU 과부하를 유발하는지 알 수 있습니까?
저는 SQL Profiler를 실행해 보았지만, 많은 일이 진행되고 있기 때문에 특별히 원인이 되는 것이 있는지 확인하기가 어렵습니다.
sp_who2를 실행했지만 모든 것이 정확히 무엇을 의미하는지, 그리고 여기서 가능한 문제를 식별하는 것이 가능한지 확신할 수 없습니다.
"아마도 많이 사용되고 있을 것"이라는 반응을 막기 위해, 이것은 오늘날 완전히 정상적인 활동 수준에서 시작되었습니다.
저는 SQL에서 CPU 문제를 일으키는 원인을 찾고 있습니다.
이 쿼리는 DMV를 사용하여 CPU별로 가장 비용이 많이 드는 쿼리를 식별합니다.
SELECT TOP 20
qs.sql_handle,
qs.execution_count,
qs.total_worker_time AS Total_CPU,
total_CPU_inSeconds = --Converted from microseconds
qs.total_worker_time/1000000,
average_CPU_inSeconds = --Converted from microseconds
(qs.total_worker_time/1000000) / qs.execution_count,
qs.total_elapsed_time,
total_elapsed_time_inSeconds = --Converted from microseconds
qs.total_elapsed_time/1000000,
st.text,
qp.query_plan
FROM
sys.dm_exec_query_stats AS qs
CROSS APPLY
sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY
sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY
qs.total_worker_time DESC
자세한 설명은 다음을 참조하십시오.CPU별로 가장 비용이 많이 드는 SQL Server 쿼리 식별 방법
여기서는 CPU가 실제로 SQL 프로세스에서 사용되고 있음을 확인했다고 가정합니다(perfmon Process 범주 카운터에서 확인할 수 있음).일반적으로 이러한 경우 관련 성능 카운터의 샘플을 가져와 정상적인 로드 작동 조건에서 설정한 기준선과 비교합니다.이 문제를 해결한 후에는 향후 비교를 위해 이러한 기준선을 설정하는 것이 좋습니다.
매 CPU 주기마다 SQL이 소비하는 위치를 정확하게 확인할 수 있습니다.하지만 어디를 봐야 하는지 아는 것은 많은 방법과 경험을 필요로 합니다.SQL은 2005/2008 또는 2000입니까?다행히도 2005년 이후에는 몇 가지 솔루션이 출시되었습니다.존 샘슨의 대답과 함께 이미 여기에 몇 가지 좋은 지침이 있습니다.SQL Server 성능 대시보드 보고서를 다운로드하여 설치하는 방법을 추가하려고 합니다.이러한 보고서에는 시간별 또는 I/O별 상위 쿼리, 가장 많이 사용되는 데이터 파일 등이 포함되어 있어 문제가 어디에 있는지 빠르게 파악할 수 있습니다.출력은 수치적이고 그래픽적이기 때문에 초보자에게 더 유용합니다.
Adam's Who is Active 스크립트를 사용하는 것도 권장하지만, 이 스크립트는 좀 더 고급입니다.
마지막으로 MS SQL Customer Advisory Team의 성능 분석 백서인 SQL 2005 Waits and Queues를 다운로드하여 읽어 보시기 바랍니다.
I/O도 검토하는 것이 좋습니다.서버에 버퍼 풀을 트래시하는 로드를 추가한 경우(예:메모리에서 캐시된 데이터 페이지를 제거할 정도로 많은 데이터가 필요합니다. 그 결과 CPU가 상당히 증가할 것입니다(놀랍게 들리지만 사실입니다).범인은 일반적으로 큰 테이블을 엔드 투 엔드로 스캔하는 새로운 쿼리입니다.
다음과 같은 유용한 쿼리를 찾을 수 있습니다.
이것은 저에게 많은 도움이 되었습니다.
SELECT s.session_id,
r.status,
r.blocking_session_id 'Blk by',
r.wait_type,
wait_resource,
r.wait_time / (1000 * 60) 'Wait M',
r.cpu_time,
r.logical_reads,
r.reads,
r.writes,
r.total_elapsed_time / (1000 * 60) 'Elaps M',
Substring(st.TEXT,(r.statement_start_offset / 2) + 1,
((CASE r.statement_end_offset
WHEN -1
THEN Datalength(st.TEXT)
ELSE r.statement_end_offset
END - r.statement_start_offset) / 2) + 1) AS statement_text,
Coalesce(Quotename(Db_name(st.dbid)) + N'.' + Quotename(Object_schema_name(st.objectid, st.dbid)) + N'.' +
Quotename(Object_name(st.objectid, st.dbid)), '') AS command_text,
r.command,
s.login_name,
s.host_name,
s.program_name,
s.last_request_end_time,
s.login_time,
r.open_transaction_count
FROM sys.dm_exec_sessions AS s
JOIN sys.dm_exec_requests AS r
ON r.session_id = s.session_id
CROSS APPLY sys.Dm_exec_sql_text(r.sql_handle) AS st
WHERE r.session_id != @@SPID
ORDER BY r.cpu_time desc
의 분야에서status
,wait_type
그리고.cpu_time
현재 실행 중인 가장 CPU를 많이 사용하는 태스크를 찾을 수 있습니다.
둘 중 하나를 몇 초 간격으로 실행합니다.높은 CPU 연결을 감지할 수 있습니다.또는: 로컬 변수에 저장된 CPU, WAIT FOR DELETY, 저장된 CPU 값과 현재 CPU 값 비교
select * from master..sysprocesses
where status = 'runnable' --comment this out
order by CPU
desc
select * from master..sysprocesses
order by CPU
desc
가장 우아하지는 않지만 효과적이고 신속할 것입니다.
SQL Profiler를 실행하고 CPU 또는 기간별로 필터링하여 모든 "작은 항목"을 제외할 수 있습니다.그러면 특정 저장 프로시저와 같은 문제가 필요한 것보다 훨씬 오래 실행되고 있는지 확인하는 것이 훨씬 쉬워질 것입니다(인덱스 누락 등일 수 있음).
두 가지 주의 사항:
- 만약 엄청난 양의 작은 거래가 문제라면, 위에서 설명한 필터는 그것들을 제외할 것이고, 당신은 이것을 놓칠 것입니다.
- 또한 문제가 8시간의 분석 작업이나 10억 개 행을 교차 결합해야 하는 잘못 설계된 선택과 같은 단일 대규모 작업인 경우 프로파일링 중인 이벤트(sp:completed vs sp:completed)에 따라 프로파일링이 완료될 때까지 프로파일러에 이 작업이 표시되지 않을 수 있습니다.
하지만 보통은 Activity Monitor 또는 sp_who2부터 시작합니다.
GUI 접근 방식의 경우 Management(관리)에서 Activity Monitor(활동 모니터)를 살펴보고 CPU별로 정렬합니다.
언급URL : https://stackoverflow.com/questions/945063/how-do-i-find-out-what-is-hammering-my-sql-server
'programing' 카테고리의 다른 글
IIS URL 다시 쓰기 및 Web.config (0) | 2023.06.26 |
---|---|
Springfox @RestController 명명 (0) | 2023.06.26 |
Firebase 사용자의 displayName을 설정하려면 어떻게 해야 합니까? (0) | 2023.06.26 |
Can't get query string parameter value (0) | 2023.06.26 |
R에서 확장자가 없는 파일 이름 가져오기 (0) | 2023.06.26 |