활동 모니터를 보면 최근에 비싼 쿼리와 쿼리 열 아래에 "fetch api_cursor0000000000000003"이 표시됩니다. 이게 뭐야? 이 쿼리 뒤에 무엇이 실행되고 있는지 어떻게 알 수 있습니까?
분명히 그 질문의 힌트는 "Fetch and Cursor"키워드였습니다. 그래서 시작점이 무엇인지 알았습니다. 쿼리를 추적하고 싶지만 프로파일 러를 캡처하거나 sys.sysprocesses 또는 DBCC INPUTBUFFER의 기존 방법을 사용하면 다음과 같은 상황이 몇 번이나 나타납니다.
프로파일 러에서도 똑같은 것은 아래와 같습니다.
EXEC sp_cursorfetch 180150003,16,8,1
또는
FETCH API_CURSOR0000000000000001
참고 : 쿼리의 숫자는 환경에 따라 다를 수 있습니다. 다음은 문제를 시뮬레이션하는 VBScript 코드입니다.
Dim strConnection
Dim MyConnection
Dim MyRecordSet
Dim strSQL
strConnection = “Provider=SQLOLEDB;Data Source=.\SQL2014;Initial Catalog=Master;Integrated Security=SSPI;”
Set MyConnection = CreateObject(“ADODB.Connection”)
MyConnection.Open strConnection
Set MyRecordSet = CreateObject(“ADODB.recordset”)
strSQL = “SELECT TOP 3 * FROM sysobjects”
MyRecordSet.Cursorlocation = 2
MyRecordSet.Open strSQL, MyConnection, 3,3
MyRecordSet.MoveFirst
WHILE NOT MyRecordSet.EOF
MsgBox(MyRecordSet(“name”).value)
MyRecordSet.MoveNext
WEND
MyRecordSet.Close
Set MyRecordSet = Nothing
문제를 재현하려면 위의 코드를 파일에 저장하고 확장명 .vbs를 유지할 수 있습니다. 그런 다음 명령 프롬프트에서 실행할 수 있습니다. 환경에 맞게 연결 문자열에서 Source 값을 변경해야 할 수 있습니다. VB 스크립트를 실행하면 테이블 이름이 포함 된 팝업이 표시됩니다. 프로파일 러가 처음부터 캡처 된 경우 쿼리를 알 수있는 sp_cursoropen이 표시되어야합니다. 쿼리가 이미 실행중인 경우 아래 쿼리를 사용할 수 있습니다.
SELECT creation_time,
cursor_id,
c.session_id,
c.properties,
c.creation_time,
c.is_open,
SUBSTRING(st.TEXT, ( c.statement_start_offset / 2) + 1, (
( CASE c.statement_end_offset
WHEN -1 THEN DATALENGTH(st.TEXT)
ELSE c.statement_end_offset
END - c.statement_start_offset) / 2) + 1) AS statement_text
FROM sys.Dm_exec_cursors(0) AS c
JOIN sys.dm_exec_sessions AS s
ON c.session_id = s.session_id
CROSS apply sys.Dm_exec_sql_text(c.sql_handle) AS st
GO
다음은 샘플 실행입니다. 보시다시피 커서를 연 쿼리 텍스트를 얻을 수 있습니다.
참고 : cursor_id는 sp_cursorfetch에서 본 것과 동일합니다. 또한 전체 프로필을 캡처하면 아래 출력을 볼 수 있습니다.
쿼리가 시작된 이후 전체 프로파일 러를 보거나 캡처 sp_cursorfetch 하거나 sys.Dm_exec_cursors를 사용하여 정확한 쿼리를 가져옵니다.FETCH API_CURSOR0000000000000001
'Database > SQL Server' 카테고리의 다른 글
In-Memory OLTP (0) | 2020.08.28 |
---|---|
Backup Script (0) | 2020.08.28 |
index dmv (0) | 2020.08.27 |
운영 데이터 저장소 Vs 데이터 웨어하우스 (0) | 2020.08.27 |
Ad-hoc 쿼리를 매개변수화 하여 성능 높이기 (0) | 2020.08.27 |