문제

CPU 사용률을 분석할 수 있습니까? 데이터베이스별?

저는 이상적으로는 SQL 서버용 작업 관리자 유형 인터페이스를 찾고 있지만 각 PID의 CPU 사용률(예: taskmgr) 또는 각 SPID(예: spwho2k5), 각 데이터베이스의 총 CPU 사용률을 보고 싶습니다.단일 SQL 인스턴스를 가정합니다.

이 데이터를 수집하고 이에 대해 보고하는 도구를 작성할 수 있다는 것을 알고 있지만, 어떤 데이터베이스가 데이터 분석에 가장 많이 기여하고 있는지 실시간으로 볼 수 있는 도구가 있는지 궁금합니다. sqlservr.exe CPU 부하.

도움이 되었습니까?

해결책

일종의.이 쿼리를 확인하세요.

SELECT total_worker_time/execution_count AS AvgCPU  
, total_worker_time AS TotalCPU
, total_elapsed_time/execution_count AS AvgDuration  
, total_elapsed_time AS TotalDuration  
, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads 
, (total_logical_reads+total_physical_reads) AS TotalReads
, execution_count   
, SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1  
, ((CASE qs.statement_end_offset  WHEN -1 THEN datalength(st.TEXT)  
ELSE qs.statement_end_offset  
END - qs.statement_start_offset)/2) + 1) AS txt  
, 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 1 DESC

이렇게 하면 계획 캐시에서 CPU를 얼마나 사용했는지 순서대로 쿼리를 얻을 수 있습니다.SQL 에이전트 작업처럼 이를 주기적으로 실행하고 결과를 테이블에 삽입하여 재부팅 후에도 데이터가 지속되는지 확인할 수 있습니다.

결과를 읽으면 왜 해당 데이터를 개별 데이터베이스와 직접 연관시킬 수 없는지 깨닫게 될 것입니다.첫째, 단일 쿼리는 다음과 같은 트릭을 수행하여 실제 데이터베이스 부모를 숨길 수도 있습니다.

USE msdb
DECLARE @StringToExecute VARCHAR(1000)
SET @StringToExecute = 'SELECT * FROM AdventureWorks.dbo.ErrorLog'
EXEC @StringToExecute

쿼리는 MSDB에서 실행되지만 결과는 AdventureWorks에서 폴링됩니다.CPU 사용량을 어디에 할당해야 합니까?

다음과 같은 경우 상황이 더욱 악화됩니다.

  • 여러 데이터베이스 간 조인
  • 여러 데이터베이스에서 트랜잭션을 실행하면 잠금 노력이 여러 데이터베이스에 걸쳐 적용됩니다.
  • MSDB에서 "작동"하지만 개별 데이터베이스를 백업하는 SQL 에이전트 작업을 MSDB에서 실행합니다.

계속해서 진행됩니다.그렇기 때문에 데이터베이스 수준이 아닌 쿼리 수준에서 성능을 조정하는 것이 합리적입니다.

SQL Server 2008R2에서 Microsoft는 단일 데이터베이스를 배포 및 배포 가능한 DAC 팩으로 패키징할 수 있는 성능 관리 및 앱 관리 기능을 도입했으며, 이는 개별 데이터베이스와 해당 애플리케이션의 성능을 더 쉽게 관리할 수 있는 기능을 약속합니다.하지만 여전히 당신이 원하는 것을 하지 않습니다.

더 자세한 내용은 다음을 확인하세요. Toad World SQL Server wiki(이전의 SQLServerPedia)에 있는 T-SQL 저장소.

평균 대신 총 숫자를 포함하도록 1/29에 업데이트되었습니다.

다른 팁

SQL Server (2000부터 시작)는 성능 카운터 (성능 모니터 또는 Perfmon에서 볼 수 있음)를 설치합니다.

카운터 범주 중 하나 (SQL Server 2005 설치의 경우 :) -SQLServer : 데이터베이스

각 데이터베이스에 대해 하나의 인스턴스가 있습니다.그러나 사용 가능한 카운터는 CPU 사용률 카운터 또는 이와 유사한 것을 제공하지 않지만 일부 속도 카운터가있어 CPU를 잘 예측하는 데 사용할 수 있습니다.예를 들어, 2 개의 데이터베이스가 있고 측정 된 속도가 데이터베이스 A에서 20 트랜잭션 / 초이고 데이터베이스 B에서 80 트랜잭션 / 초인 경우 A가 총 CPU의 약 20 %에 기여한다는 것을 알 수 있습니다B는 다른 80 %에 기여합니다.

여기에는 수행되는 모든 작업이 CPU 바운드라고 가정하기 때문에 몇 가지 결함이 있습니다. 물론 데이터베이스에서는 그렇지 않습니다.하지만 그것이 시작이라고 생각합니다.

다음은 높은로드를 유발하는 실제 데이터베이스를 표시하는 쿼리입니다.메모리 부족 시나리오에서 자주 플러시 될 수있는 쿼리 캐시에 의존합니다 (쿼리의 유용성이 떨어짐). 라코 디스

귀하의 질문에 대한 대답은 '아니요'라고 생각합니다.

문제는 한 컴퓨터에서 한 작업으로 인해 여러 데이터베이스에로드가 발생할 수 있다는 것입니다.구성 DB에서 읽고 로깅 DB에 로깅하며 유형에 따라 다양한 DB에서 트랜잭션을 이동하는 프로세스가있는 경우 CPU 사용량을 어떻게 분할합니까?

CPU 사용률을 트랜잭션로드로 나눌 수는 있지만 이는 사용자를 오도 할 수있는 대략적인 지표입니다.예를 들어 트랜잭션 로그 전달을 한 DB에서 다른 DB로 어떻게 나누겠습니까?읽기 또는 쓰기에 CPU 부하가 있습니까?

머신의 트랜잭션 속도와 그로 인해 발생하는 CPU 부하를 살펴 보는 것이 좋습니다.또한 저장 프로 시저를 프로파일 링하여 과도한 시간이 걸리는지 확인할 수 있습니다.하지만 원하는 답을 얻을 수는 없습니다.

위의 모든 사항을 염두에두고 있습니다.
SQL Server 2012 (2008 일 수 있습니까?)부터 sys.dm_exec_sessions database_id 열이 있습니다.
현재 연결된 세션에 대한 각 데이터베이스의 CPU를 쉽게 계산할 수 있습니다.세션이 끊어지면 결과가 사라집니다. 라코 디스

SQL Sentry 를 살펴보세요.필요한 모든 기능을 제공합니다.

감사합니다. Lieven

SQL 프로파일 러를 보셨습니까?

표준 "T-SQL"또는 "저장 프로 시저"템플릿을 사용하여 필드를 조정하여 데이터베이스 ID별로 그룹화합니다 (숫자를 사용해야한다고 생각하지만 데이터베이스 이름은 알 수 없지만 쉽게 찾을 수 있습니다.exec sp_databases를 사용하여 목록 가져 오기)

잠시 실행하면 총 CPU 수 / 디스크 IO / 대기 등을 얻을 수 있습니다. 이렇게하면 각 데이터베이스에서 사용하는 CPU의 비율을 알 수 있습니다.

동시에 PerfMon 카운터를 모니터링하고 (데이터를 SQL 데이터베이스에 기록) SQL 프로필러에 대해 동일한 작업을 수행하면 (데이터베이스에 기록) 상관 관계를 할 수 있습니다 .둘을 함께.

그래도 어떤 DB가 더 자세히 살펴볼 가치가 있는지에 대한 충분한 단서를 제공해야합니다.그런 다음 해당 데이터베이스 ID로 다시 동일한 작업을 수행하고 가장 비싼 SQL / 저장 프로 시저를 찾습니다.

이 검색어를 확인하세요. 라코 디스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top