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

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

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

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

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

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

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

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

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

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

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

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

Если приложение подключается к источнику данных, для которого включено профилирование, драйвер возвращает ошибку SQL_ERROR , если приложение вызывает SQLSetConnectOptionдля запуска записи в журнал. Вызов метода SQLGetDiagRec возвращает следующие данные.

SQLState: 01000, pfNative = 0ErrorMsg: [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.

Transactions

Количество пользовательских транзакций после 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.

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

Количество пакетов потока табличных данных (TDS), отправленных драйвером в SQL Server после SQL_PERF_START. Большие команды могут занимать несколько буферов, поэтому если на сервер отправляется большая команда, занимающая шесть пакетов, значение ServerRndTrips увеличивается на 1, а значение BuffersSent – на 6.

BuffersRec

Количество пакетов TDS, полученных драйвером от SQL Server после начала использования драйвера приложением.

BytesSent

Количество байтов данных, отправленных на сервер SQL Server в пакетах TDS после начала использования драйвера приложением.

BytesRec

Количество байтов данных в пакетах TDS, полученных драйвером от SQL Server после начала использования драйвера приложением.

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

Поле SQLPERF

Описание

msExecutionTime

Общее количество времени, затраченного драйвером на обработку после SQL_PERF_START, включая время на ожидание ответов от сервера.

msNetworkServerTime

Общее количество времени, затраченного драйвером на ожидание ответов от сервера.