다음을 통해 공유


ODBC 드라이버 성능 프로파일링

적용 대상: SQL Server Azure SQL Database 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)