Select * from sys.dm_tran_session_transactions
-->연결된 트랜잭션 및 활성화된 세션에 대한 상관 관계 정보를 표시
현재 열린 Tran 없음
Select * from sys.dm_exec_sessions
-->모든 활성 사용자 연결 표시
현재 사용자 세션으로는 SERVER MANAGEMENT STUDIO 와 쿼리 분석기에 대한 세션이 열려있음
중요 컬럼으로 last_request_end_time은 해당 세션 사용자가 마지막으로 요청한 쿼리요청 응답결과의 시간을 표시
Select * from sys.dm_exec_connections
-->SQL Server의 이 인스턴스에 대해 설정된 연결에 대한 정보와 각 연결에 대한 세부 정보를 표시
현재 인스턴스에 설정된 열결정보 표시 51,52번 세션에 대한 세부정보가 표시된
새쿼리로 세션창 하나 추가(53번 세션이 추가되었음)
53번 세션 창에서 하기의 SQL 실행
begin tran
select * from Person.Address
where addressid =4
52번 세션창에서 sys.dm_tran_session_transactions DMV 조회결과 53번 세션창에서 사용자가
실행한 트랜젝션 내역이 표시(Is_User_TranSACTION=1)
52번 세션 창에서 하기의 쿼리를 실행
로직은 간단함 마지막 실행 요청 응답 시간과 현재 시간을 비교하여 3초이상이 걸리는 쿼리 및 유처 정보 상세 내역을 가져오는 쿼리
응답시간이 있다고 해도 sys.dm_tran_session_transactions 과 Inner 조인에 걸리는 쿼리는 Commit OR rollback된 쿼리가 아님
초를 분으로 시간은 3초에서 원하는 시간으로 변경가능함
Select es.login_name,es.original_login_name, st.session_id,
datediff(SECOND, last_request_end_time, getdate()) AS '걸린시간(초)',
text, last_request_end_time, getdate() AS '현재시간',
es.reads, es.writes, es.logical_reads
From sys.dm_tran_session_transactions st
Inner join sys.dm_exec_sessions es
on es.session_id = st.session_id
Inner join sys.dm_exec_connections ec
on ec.session_id = es.session_id
Cross apply sys.dm_exec_sql_text(ec.most_recent_sql_handle)
where IS_USER_Transaction = 1
AND datediff(SECOND, last_request_end_time, getdate()) > 3
결과
만약 실수로 Tran 걸고 Commit 안하고 퇴근한놈 걸리면 그놈은 죽는거다 -_-
'연구개발 > DBA' 카테고리의 다른 글
응용 프로그램 성능 최적화를 위한 숨겨진 데이터 찾기 (0) | 2011.08.16 |
---|---|
조각화에 따른 성능 비교 (0) | 2011.08.14 |
엑셀->SQL->CSV 한방에 끝내기 (0) | 2011.08.14 |
모든 DB의 인덱스 조각도 현황 쿼리 (0) | 2011.08.14 |
로컬변수 사용에 따른 이상한 실행계획 (0) | 2011.08.14 |