2010-03-23 2 views

답변

24

10 최악의 쿼리를 쿼리 ... : 당신이 촬영 시간을 기준으로 최악의 성능 쿼리를 찾으려면

SELECT TOP 10 
    total_worker_time/execution_count AS Avg_CPU_Time 
     ,execution_count 
     ,total_elapsed_time/execution_count as AVG_Run_Time 
     ,(SELECT 
       SUBSTRING(text,statement_start_offset/2,(CASE 
                  WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 
                  ELSE statement_end_offset 
                 END -statement_start_offset)/2 
         ) FROM sys.dm_exec_sql_text(sql_handle) 
     ) AS query_text 
FROM sys.dm_exec_query_stats 

--pick your criteria 

ORDER BY Avg_CPU_Time DESC 
--ORDER BY AVG_Run_Time DESC 
--ORDER BY execution_count DESC 
+0

+1 나를 위해 꽤 잘 작동합니다.반환 된 행에서 일부 중복 것으로 보이지만 올바르게 보입니다. –

+2

중복 된 행은 무효화 된 쿼리 계획의 이전 버전 일 수 있습니다 (다양한 이유, 통계 변경이 일반적인 것임). 계획이 배출되지 않았습니다. 무효화되면서 메모리에 저장됩니다. 또 다른 이유는 다른 매개 변수를 가진 많은 유사한 쿼리가 캐시에있을 수 있고 임시 SQL이 아닌 저장 프로 시저에서 발생하지만 그렇지 않을 때 많은 복제본처럼 보이는 매개 변수화 (또는 부족) 일 것입니다. – Andrew

+0

@KM : 약간의 대체 답변을 추가하십시오. sys.dm_exec_query_plan에 가입하고 쿼리 계획을 가져 오는 방법 - 항상 최악의 수행으로 캐시에서 추출 할 가치가 있습니다. – Andrew

3

는 SQL 프로파일 러

  • 시작으로 느린 성능 쿼리를 찾기 :

    SELECT TOP 5 obj.name, max_logical_reads, max_elapsed_time 
    FROM sys.dm_exec_query_stats a 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd 
    INNER JOIN sys.sysobjects obj on hnd.objectid = obj.id 
    ORDER BY max_logical_reads DESC 
    

    가에서 촬영 SQL 프로파일 러 (라이브 데이터베이스 선호).

  • 파일 -> 새 추적
  • 선택 SQL 서버
  • 탭 필터
  • 가 선택적으로 테이블에 데이터베이스 이름
  • 시작 프로파일 러 (RUN)
  • 저장 결과에 필터를 설정 에 대한 예 : _Mytrace, 이미 많은 것을 얻지 못한 데이터베이스 서버에 우선적으로 수행
  • 선택 쿼리 필터링
  • 이것에 대한
  • 확인 exectution 계획에 따라
+0

프로파일 러를 실행하는 것은 확실히 좋은 첫 번째 옵션입니다. 일단 프로파일 러 기능을 잘 이해하면 추적을 실행할 수 있습니다. –

+0

프로덕션 서버 자체에서 너무 오랫동안 프로파일 러를 실행하지 마십시오. 기본 모드에서는 리소스 호그입니다. –

4

, 나는이를 사용하십시오 :

SELECT * 
FROM sys.dm_exec_query_stats a 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd 
ORDER BY total_elapsed_time/execution_count DESC 

그러나, "최악의"쿼리를 찾는 것은 종종 exec_query_stats DMV에 프로빙 좀 더 필요합니다. 고려해야 할 사항이 많이 있습니다.

  1. 위의 쿼리를 수행하는 데 걸리는 최악의 개별 쿼리.
  2. 최다 CPU hogs (주문량이 많을 경우) total_worker_time/execution_count
  3. 가장 자주 읽는 검색어는 가장 오래 걸리는 검색어입니다.

이제 이러한 쿼리는 성능이 좋지 않은 쿼리를 강조하지만 종종 "공정한"성능의 쿼리가있을 수 있지만 매우 자주 호출되어 앱의 전반적인 성능을 저하시킵니다. 이를 찾으려면 위의 쿼리를 total_elapsed 시간 (또는 total_[whatever metric you are interested in])까지 주문하고 execution_count으로 나누지 마십시오.

6

This MSDN Magazine 기사는이 항목에 대한 훌륭한 정보를 제공합니다.

+0

+1 멋진 기사! –

+0

우수 기사 +1이 2008 년 문제가 발생했습니다. –

+0

@ThomasBratt 해당 쿼리를 실행하려면 데이터베이스의 호환성 수준을 변경해야 할 수 있습니다. 나는 그랬다. –