Анализ производительности драйвера ODBC

Драйвер ODBC собственного клиента SQL Server может профилирование двух типов данных производительности:

  • Длительные запросы.

    Драйвер может записать в файл журнала любой запрос, который не получает ответ от сервера в течение указанного периода времени. Затем программисты приложений или администраторы баз данных могут исследовать каждую зарегистрированную инструкцию SQL, чтобы определить, как они могут повысить производительность.

  • Данные о производительности драйверов.

    Драйвер может записывать статистику производительности и записывать их в файл или сделать их доступными для приложения с помощью структуры данных для конкретного драйвера с именем SQLPERF. Файл, содержащий статистику производительности, — это файл с разделителями табуляции, который можно легко анализировать с помощью любой электронной таблицы, поддерживающей файлы с разделителями табуляции, например Microsoft Excel.

Любой тип профилирования можно включить следующим способом:

  • Подключение к источнику данных, указывающее ведение журнала.

  • Вызов SQLSetConnectAttr для задания атрибутов, относящихся к драйверу, которые управляют профилированием.

Каждый процесс приложения получает собственную копию драйвера ODBC собственного клиента SQL Server, а профилирование — глобальное сочетание копии драйвера и процесса приложения. Когда все, что в приложении включает профилирование, профилирование записывает сведения обо всех подключениях, активных в драйвере из этого приложения. Включены даже подключения, которые не вызывали специальное профилирование.

После того как драйвер открыл журнал профилирования (данные о производительности или длительный журнал запросов), он не закрывает журнал до тех пор, пока драйвер не выгрузится диспетчером драйверов ODBC, когда приложение освобождает всю среду, которая обрабатывает ее, открытую в драйвере. Если приложение открывает новый дескриптор среды, загружается новая копия драйвера. Если приложение подключается к источнику данных, который указывает тот же файл журнала или задает атрибуты для конкретного драйвера для входа в тот же файл, драйвер перезаписывает старый журнал.

Если приложение начинает профилирование в файл журнала, а второе приложение пытается начать профилирование в том же файле журнала, то второе приложение не может записывать данные профилирования. Если второе приложение начинает профилирование после того, как первое приложение выгрузило его драйвер, второе приложение перезаписывает файл журнала из первого приложения.

Если приложение подключается к источнику данных с включенным профилированием, драйвер возвращает SQL_ERROR если приложение вызывает SQLSetConnectOption для запуска ведения журнала. Затем вызов 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 имеет несколько подключений, каждое из которых имеет собственный дескриптор среды, драйвер перестанет собирать данные о производительности при закрытии любого из связанных дескрипторов среды.

Данные о производительности драйвера могут храниться в структуре данных SQLPERF или вошедшего в файл с разделителями табуляции. Данные включают следующие категории статистики:

  • Профиль приложения

  • Подключение

  • Сеть

  • Время

В следующей таблице описания полей в структуре данных SQLPERF также применяются к статистике, записанной в файле журнала производительности.

Статистика профиля приложения

Поле SQLPERF Описание
TimerResolution Минимальное разрешение часов сервера в миллисекундах. Обычно это сообщается как 0 (ноль) и должно рассматриваться только в том случае, если сообщаемое число большое. Если минимальное разрешение часов сервера превышает вероятный интервал для некоторых статистических данных на основе таймера, эти статистические данные могут быть раздуваются.
SQLidu Количество инструкций INSERT, DELETE или UPDATE после SQL_PERF_START.
SQLiduRows Количество инструкций INSERT, DELETE или UPDATE после SQL_PERF_START.
Выборы SQLSelects Количество инструкций SELECT, обработанных после SQL_PERF_START.
SQLSelectRows Количество строк, выбранных после SQL_PERF_START.
Транзакции Количество транзакций пользователей после SQL_PERF_START, включая откаты. При запуске приложения ODBC с SQL_AUTOCOMMIT_ON каждая команда считается транзакцией.
SQLPrepares Количество вызовов функции SQLPrepare после SQL_PERF_START.
ExecDirects Количество вызовов SQLExecDirect после SQL_PERF_START.
SQLExecutes Количество вызовов SQLExecute после SQL_PERF_START.
CursorOpens Количество раз, когда драйвер открыл курсор сервера после SQL_PERF_START.
Курсоры Количество строк в результирующих наборах, открытых курсорами после SQL_PERF_START.
CursorUsed Количество строк, фактически полученных через драйвер из курсоров после SQL_PERF_START.
PercentCursorUsed Равно cursorUsed/CursorSize. Например, если приложение приводит к тому, что драйвер открывает курсор сервера для выполнения команды SELECT COUNT(*) FROM Authors, 23 строки будут находиться в результирующем наборе инструкции SELECT. Если приложение получает только три из этих строк, 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 Количество пакетов табличного потока данных (TDS), отправленных в SQL Server драйвером после SQL_PERF_START. Большие команды могут принимать несколько буферов, поэтому если большая команда отправляется на сервер, и она заполняет шесть пакетов, ServerRndTrips увеличивается по одному, и buffersSent увеличивается на шесть.
BuffersRec Количество пакетов TDS, полученных драйвером из SQL Server после запуска приложения с помощью драйвера.
Отправленные байты Количество байтов данных, отправленных в SQL Server в пакетах TDS после запуска приложения с помощью драйвера.
BytesRec Количество байтов данных в пакетах TDS, полученных драйвером из SQL Server после запуска приложения с помощью драйвера.

Статистика времени

Поле SQLPERF Описание
msExecutionTime Совокупное время, затраченное драйвером на обработку после SQL_PERF_START, включая время, затраченное на ожидание ответов с сервера.
msNetworkServerTime Совокупное время, затраченное драйвером на ожидание ответов с сервера.

См. также

SQL Server Native Client (ODBC)
Инструкции по профилированию драйвера ODBC (ODBC)