ODBC 드라이버 성능 프로파일링
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
Important
SNAC(SQL Server Native Client)는 다음과 함께 제공되지 않습니다.
- SQL Server 2022(16.x) 이상 버전
- SQL Server Management Studio 19 이상 버전
SQL Server Native Client(SQLNCLI 또는 SQLNCLI11)와 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 새로운 응용 프로그램 개발에 권장되지 않습니다.
새 프로젝트의 경우 다음 드라이버 중 하나를 사용합니다.
SQL Server 데이터베이스 엔진(버전 2012부터 2019까지)의 구성 요소로 제공되는 SQLNCLI의 경우 이 수명 주기 예외 지원을 참조하세요.
SQL Server Native Client ODBC 드라이버는 다음 두 가지 유형의 성능 데이터를 프로파일할 수 있습니다.
장기 실행 쿼리.
드라이버는 지정된 시간 내에 서버로부터 응답을 받지 못한 쿼리를 로그 파일에 기록할 수 있습니다. 그런 다음 애플리케이션 프로그래머 또는 데이터베이스 관리자는 기록된 각 SQL 문을 조사하여 성능을 향상시킬 수 있는 방법을 결정할 수 있습니다.
드라이버 성능 데이터입니다.
드라이버는 성능 통계를 기록하고 파일에 쓰거나 SQLPERF라는 드라이버별 데이터 구조를 통해 애플리케이션에서 사용할 수 있도록 할 수 있습니다. 성능 통계를 포함하는 파일은 탭으로 구분된 파일로, Microsoft Excel과 같이 탭으로 구분된 파일을 지원하는 스프레드시트로 쉽게 분석할 수 있습니다.
프로파일링 유형은 다음을 통해 설정할 수 있습니다.
로깅을 지정하는 데이터 원본에 연결
SQLSetConnectAttr를 호출하여 프로파일링을 제어하는 드라이버별 특성을 설정합니다.
각 애플리케이션 프로세스는 SQL Server Native Client ODBC 드라이버의 자체 복사본을 가져오며 프로파일링은 드라이버 복사본과 애플리케이션 프로세스의 조합으로 전역화됩니다. 애플리케이션의 어떤 항목이 프로파일링을 활성화하면 프로파일링은 해당 애플리케이션의 드라이버에서 활성 상태인 모든 연결에 대한 정보를 기록합니다. 프로파일링을 구체적으로 요구하지 않은 연결도 포함됩니다.
드라이버가 프로파일링 로그(성능 데이터 또는 장기 실행 쿼리 로그)를 연 후에는 애플리케이션이 드라이버에서 연 모든 환경을 해제할 때 드라이버가 ODBC 드라이버 관리자에 의해 언로드될 때까지 로그를 닫지 않습니다. 애플리케이션에서 새 환경 핸들을 열면 드라이버의 새 복사본이 로드됩니다. 이후 애플리케이션이 동일한 로그 파일을 지정하는 데이터 원본에 연결되거나 동일한 파일에 기록하도록 드라이버별 특성을 설정하면 드라이버는 기존 로그를 덮어씁니다.
애플리케이션이 로그 파일에 프로파일링을 시작한 상태에서 두 번째 애플리케이션이 동일한 로그 파일에 프로파일링을 시작하려고 시도하면 두 번째 애플리케이션은 어떠한 프로파일링 데이터도 기록할 수 없습니다. 첫 번째 애플리케이션이 드라이버를 언로드한 후 두 번째 애플리케이션이 프로파일링을 시작하면 두 번째 애플리케이션은 첫 번째 애플리케이션에서 로그 파일을 덮어씁니다.
애플리케이션이 프로파일링을 사용하도록 설정된 데이터 원본에 연결하는 경우 애플리케이션이 SQLSetConnectOption을 호출하여 로깅을 시작하면 드라이버가 SQL_ERROR 반환합니다. 그런 다음 SQLGetDiagRec에 대한 호출은 다음을 반환합니다.
SQLState: 01000, pfNative = 0
ErrorMsg: [Microsoft][SQL Server Native Client]
An error has occurred during the attempt to access
the log file, logging disabled.
환경 핸들이 닫힌 경우 드라이버는 성능 데이터 수집을 중지합니다. SQL Server Native Client 애플리케이션에 각각 자체 환경 핸들이 있는 여러 연결이 있는 경우 연결된 환경 핸들이 닫혀 있으면 드라이버가 성능 데이터 수집을 중지합니다.
드라이버의 성능 데이터는 SQLPERF 데이터 구조에 저장되거나 탭으로 구분된 파일에 기록될 수 있습니다. 데이터에는 다음 통계 범주가 포함됩니다.
애플리케이션 프로필
Connection
네트워크
Time
다음 표에서 SQLPERF 데이터 구조의 필드에 대한 설명은 성능 로그 파일에 기록된 통계에도 적용됩니다.
애플리케이션 프로필 통계
SQLPERF 필드 | 설명 |
---|---|
TimerResolution | 서버 클록 시간의 최소 해상도(밀리초)입니다. 이 값은 일반적으로 0으로 보고되며 보고된 수가 큰 경우에만 고려해야 합니다. 서버 클록의 최소 해상도가 일부 타이머 기반 통계의 가능한 간격보다 크면 해당 통계가 확장될 수 있습니다. |
SQLidu | SQL_PERF_START 이후의 INSERT, DELETE 또는 UPDATE 문의 수입니다. |
SQLiduRows | SQL_PERF_START 이후의 INSERT, DELETE 또는 UPDATE 문의 수입니다. |
SQLSelects | SQL_PERF_START 후 처리된 SELECT 문의 수입니다. |
SQLSelectRows | SQL_PERF_START 후 선택한 행 수입니다. |
트랜잭션 | 롤백을 포함하여 SQL_PERF_START 이후의 사용자 트랜잭션 수입니다. SQL_AUTOCOMMIT_ON 사용하여 ODBC 애플리케이션을 실행하는 경우 각 명령은 트랜잭션으로 간주됩니다. |
SQLPrepares | SQL_PERF_START 이후의 SQLPrepare 함수 호출 수입니다. |
ExecDirects | SQL_PERF_START 이후의 SQLExecDirect 호출 수입니다. |
SQLExecutes | SQL_PERF_START 이후의 SQLExecute 호출 수입니다. |
CursorOpens | SQL_PERF_START 이후 드라이버가 서버 커서를 연 횟수입니다. |
CursorSize | SQL_PERF_START 후 커서가 연 결과 집합의 행 수입니다. |
CursorUsed | SQL_PERF_START 후 커서에서 드라이버를 통해 실제로 검색된 행의 수입니다. |
PercentCursorUsed | CursorUsed/CursorSize와 같습니다. 예를 들어 애플리케이션에서 드라이버가 서버 커서를 열어 "SELECT COUNT(*) FROM Authors"를 수행하도록 하는 경우 SELECT 문에 대한 결과 집합에 23개의 행이 있습니다. 애플리케이션이 이러한 행 중 세 개만 가져오는 경우 CursorUsed/CursorSize는 3/23이므로 PercentCursorUsed는 13.043478입니다. |
AvgFetchTime | SQLFetchTime/SQLFetchCount와 같습니다. |
AvgCursorSize | CursorSize/CursorOpens와 같습니다. |
AvgCursorUsed | CursorUsed/CursorOpens와 같습니다. |
SQLFetchTime | 서버 커서에 대한 페치를 완료하는 데 걸린 누적 시간입니다. |
SQLFetchCount | SQL_PERF_START 이후 서버 커서에 대해 수행된 인출 횟수입니다. |
CurrentStmtCount | 드라이버에서 열려 있는 모든 연결에서 현재 열려 있는 문 핸들의 수입니다. |
MaxOpenStmt | SQL_PERF_START 후 동시에 열린 문 핸들의 최대 수입니다. |
SumOpenStmt | SQL_PERF_START 후에 열린 문 핸들의 수입니다. |
연결 통계: | |
CurrentConnectionCount | 애플리케이션이 서버에 대해 연 활성 연결 핸들의 현재 수입니다. |
MaxConnectionsOpened | SQL_PERF_START 후 열린 최대 동시 연결 핸들 수입니다. |
SumConnectionsOpened | SQL_PERF_START 후 열린 연결 핸들 수의 합계입니다. |
SumConnectionTime | SQL_PERF_START 이후 열린 모든 연결의 시간 합계입니다. 예를 들어 애플리케이션이 10개의 연결을 열었고 각 연결을 5초 동안 유지했다면 SumConnectionTime은 50초가 됩니다. |
AvgTimeOpened | SumConnectionsOpened/ SumConnectionTime과 같습니다. |
네트워크 통계: | |
ServerRndTrips | 드라이버가 서버로 명령을 보내고 응답을 받은 횟수입니다. |
BuffersSent | SQL_PERF_START 후 드라이버가 SQL Server로 보낸 TDS(테이블 형식 데이터 스트림) 패킷 수입니다. 큰 명령은 여러 버퍼를 사용할 수 있으므로 큰 명령이 서버로 전송되고 6개의 패킷을 채우는 경우 ServerRndTrips는 1씩 증가되고 BuffersSent는 6씩 증가합니다. |
BuffersRec | 애플리케이션이 드라이버를 사용하기 시작한 후 SQL Server에서 드라이버가 수신한 TDS 패킷 수입니다. |
BytesSent | 애플리케이션이 드라이버를 사용하기 시작한 후 TDS 패킷에서 SQL Server로 전송된 데이터 바이트 수입니다. |
BytesRec | 애플리케이션이 드라이버를 사용하기 시작한 후 SQL Server에서 드라이버가 수신한 TDS 패킷의 데이터 바이트 수입니다. |
시간 통계
SQLPERF 필드 | 설명 |
---|---|
msExecutionTime | 서버에서 응답을 기다리는 데 소요된 시간을 포함하여 드라이버가 SQL_PERF_START 후 처리하는 데 소요된 누적 시간입니다. |
msNetworkServerTime | 드라이버가 서버의 응답을 대기하는 데 보낸 누적 시간입니다. |
참고 항목
SQL Server Native Client(ODBC)
ODBC 드라이버 성능 프로파일링 방법 도움말 항목(ODBC)