태그 보관물: sql-server

sql-server

저장 프로 시저를 프로파일 링하는 방법 시저에서 각 개별 SQL 문을 캡처하고, 그

SQL Server 2012를 사용하고 있으며 저장 프로 시저를 프로파일 링하는 방법이 궁금합니다.

예를 들어, 프로파일 러는 스토어드 프로 시저에서 각 개별 SQL 문을 캡처하고, 그 내용 및 실행 시간 등을 파악할 수 있습니까?

병합 복제 저장 프로 시저를 진단하려고하는데 병합 에이전트 전체 실행의 일부를 캡처해야합니다. 성능 문제가있는 저장 프로 시저를 가져 와서 다시 실행할 수없는 것 같습니다. 그 시점에서 속도가 느리지 않기 때문입니다.



답변

Kevin의 답변은 SQL Trace / SQL Profiler에서 캡처 할 이벤트를 설명합니다. 해당 답변을 조금 확장하려면 SP:StmtCompleted완료 된 저장 프로 시저 내의 각 명령문을 표시합니다.

또한 사용량이 많은 시스템에 있고 성능 문제를 진단하려는 경우 SQL 프로파일 러에주의해야합니다. SQL 프로파일 러는 파일을 추적하거나 확장 이벤트를 사용하는 것보다 훨씬 느립니다. Jonathan Kehayias 의이 블로그 게시물SQL 프로파일 러 사용으로 인한 시스템 성능에 대한 약 90 %의 오버 헤드와 추적에서 파일에 대한 약 10 %의 오버 헤드를 보여줍니다 . 연장 된 이벤트의 경우 더 적습니다. 그렇기 때문에 일반적으로 SQL 프로파일 러 자체를 실행하지 않는 것이 좋습니다.

이 정보는 확장 이벤트를 통해 사용할 수 있지만 여전히 SQL Trace (SQL 프로파일 러의 기술) 를 사용하고 대신 파일을 추적하는 것이 좋습니다.(확장 이벤트 학습 및 사용에 투자하고 싶다면 앞으로 나아갈 수있는 방법이 될 것입니다. 이후 버전의 SQL Server에서는 SQL 추적이 사라지고 확장 이벤트 만 있으면됩니다.) 또한 필요한 항목 만 캡처하도록 열 필터 단추를 통해 가능한 한 많은 배경 소음을 필터링하는 것이 좋습니다. Kevin이 정답으로 설명하는 단계를 사용하여 프로파일 러 도구를 사용하여 추적을 설정 한 다음 동일한 GUI에서 필터를 추가 할 수 있습니다. 그런 다음 추적을 스크립트로 내보내고 SQL Server 추적에서 해당 스크립트를 데이터베이스 또는 트랜잭션 로그 파일이없는 폴더의 파일로 실행할 수 있습니다. 내보내려면 추적을 설정하고 몇 초 동안 실행하여 원하는 것을 캡처하고 중지 한 다음 메뉴 표시 줄로 이동하여 File->Export-> Script Trace Definition파일을 저장하십시오. 그런 다음 추적하려는 서버의 새 조회 창에서 해당 파일을여십시오. 여기서 시작하여 방금 생성 한 해당 스크립트에 사용 된 다양한 저장 프로 시저에 대한 도움말을 보면 생성 한이 스크립트의 옵션 및 정의에 대한 자세한 내용을 볼 수 있습니다 .

시간이 있고 배우고 싶다면 확장 이벤트에 대한 기사를 읽고 정보를 캡처하는 방법도 볼 수 있습니다. Jonathan Kehayias 는 블로그 게시물을 시작할 준비가되었을 때 블로그 게시물에 유용한 리소스입니다.


답변

SQL Server 프로파일 러를 통해 저장 프로 시저에서 개별 문을 캡처 할 수 있습니다. 이렇게하려면 이벤트 선택 탭에서 “모든 이벤트 표시”체크 상자를 클릭하십시오. 그런 다음 Stored Procedures 카테고리로 스크롤하여 SP : StmtCompleted 옆의 상자를 선택하십시오 . 당신은 또한이 있다면 BatchStarted : SQLSQL : BatchCompleted의 선택 이벤트를, 당신은 SPID에 의해 모두 함께 묶는, 저장 프로 시저 실행의 시작 – 투 – 엔드 사진을 얻을 수 있습니다.

또한 느리게 수행되는 프로 시저에 대한 쿼리 계획을 얻을 수 있는지 계획 캐시를 확인하는 데 도움이 될 수 있습니다. 다음과 같이 시작할 수 있습니다.

SELECT
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';


답변