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 : SQL 및 SQL : 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';