source

가장 비싼 쿼리를 기록하고 찾는 방법

lovecheck 2023. 7. 16. 13:41
반응형

가장 비싼 쿼리를 기록하고 찾는 방법

sql2k8의 작업 모니터를 통해 가장 비싼 쿼리를 볼 수 있습니다.좋습니다. 그런데 이 정보를 기록하거나 쿼리 분석기를 통해 얻을 수 있는 방법이 있나요?SQL 관리 콘솔을 열고 작업 모니터 대시보드를 보고 싶지 않습니다.

어떤 쿼리가 잘못 작성되었는지, 스키마가 잘못 설계되었는지 등을 파악하고 싶습니다.

도움을 주셔서 대단히 감사합니다!

  1. SQL Server Profiler(SSMS의 도구 메뉴)를 사용하여 다음 이벤트를 기록하는 추적을 만듭니다.

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. 표준 추적 템플릿으로 시작하여 잘라낼 수 있습니다.이것이 특정 데이터베이스에 대한 것인지 아니면 특정 DB에 대한 것인 경우 전체 서버에 대한 것인지 지정하지 않았습니다.ID 열 및 필터를 DB에 설정합니다(SELECT DB_ID('dbname')) 각 이벤트에 대해 논리적 읽기 데이터 열이 포함되어 있는지 확인합니다.파일에 기록할 추적을 설정합니다.이 추적을 백그라운드에서 무인으로 실행하는 경우 공간이 충분할 경우 최대 추적 파일 크기(500MB 또는 1GB)를 설정하는 것이 좋습니다(모든 것은 서버의 활동량에 따라 다르므로 이를 빨아들여 확인해야 할 것)

  3. 추적을 잠시 시작한 다음 일시 중지합니다.파일->내보내기->스크립트 추적 정의로 이동하여 DB 버전을 선택한 후 파일에 저장합니다.이제 프로파일러 GUI를 통해 실행하는 것보다 훨씬 적은 오버헤드를 가진 추적을 생성하는 SQL 스크립트가 있습니다.이 스크립트를 실행하면 추적 ID가 출력됩니다(일반적으로@ID=2); 이것을 적어둡니다.

  4. 추적 파일(.trc)이 있는 경우(최대 파일 크기에 도달하여 추적이 완료되었거나 다음을 사용하여 실행 중인 추적을 중지한 경우)

    EXEC sp_trace_setstatus @ID, 0
    EXEC sp_trace_setstatus @ID, 2

추적을 프로파일러에 로드하거나 ClearTrace(매우 편리)를 사용하거나 다음과 같은 테이블에 로드할 수 있습니다.

SELECT * INTO TraceTable
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)

그런 다음 쿼리를 실행하여 다음과 같은 데이터를 집계할 수 있습니다.

SELECT COUNT(*) AS TotalExecutions, 
    EventClass, CAST(TextData as nvarchar(2000))
 ,SUM(Duration) AS DurationTotal
 ,SUM(CPU) AS CPUTotal
 ,SUM(Reads) AS ReadsTotal
 ,SUM(Writes) AS WritesTotal
FROM TraceTable
GROUP BY EventClass, CAST(TextData as nvarchar(2000))
ORDER BY ReadsTotal DESC

비용이 많이 드는 쿼리를 식별한 후에는 실제 실행 계획을 생성하고 검토할 수 있습니다.

다음 스크립트는 결과를 제공합니다.

SELECT TOP 10 
SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, 
qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC 

이 도구에 대해 들어본 적이 없지만 Microsoft는 가장 느린 쿼리를 포함하여 이 기능을 완벽하게 제공하는 일련의 보고서를 제공합니다.성능 대시보드 보고서를 확인하십시오.

SQL 2008과 호환되는지는 잘 모르겠지만 확인해 볼 가치가 있습니다.

SQL Server Profiler가 필요한 작업을 수행합니까?2008년을 아직 사용하지 않았기 때문에 툴이 아직 있는지는 모르겠지만, 툴이 특정 기준을 충족하는 쿼리(예: CPU를 실행하고 특정 임계값 이상으로 구동하는 쿼리)를 기록하는 추적을 설정할 수 있다고 생각합니다.

우리는 이를 프로젝트에 사용했으며 제대로 실행되지 않는 쿼리 문제를 해결하는 데 도움이 되었습니다(풀타임으로 실행되지는 않지만 성능 상태 추적을 위해 일반 Windows Performance Counters에 의존).

서버에서 자동으로 유지 관리되는 동적 관리 보기를 기반으로 서버 성능의 개요를 제공하는 SQL Server 2008의 Performance Studio라는 새로운 도구가 있습니다.그것은 확인해 볼 가치가 있습니다.

(DELL)Quest SQL Optimizer for SQL Server 9.0에는 SQL 서버에서 리소스를 가장 많이 사용하는 SQL을 찾을 수 있는 Find SQL 모듈이 도입되었습니다.https://support.quest.com/softwaredownloads.aspx?pr=268445262

언급URL : https://stackoverflow.com/questions/257906/how-can-i-log-and-find-the-most-expensive-queries

반응형