programing

SQL Server를 방해하는 요소를 확인하려면 어떻게 해야 합니까?

instargram 2023. 6. 26. 21:02
반응형

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가 상당히 증가할 것입니다(놀랍게 들리지만 사실입니다).범인은 일반적으로 큰 테이블을 엔드 투 엔드로 스캔하는 새로운 쿼리입니다.

다음과 같은 유용한 쿼리를 찾을 수 있습니다.

SQL Server 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

반응형