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

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Внимание

Собственный клиент SQL Server (часто сокращенный SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений. Перейдите на новый драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server или последний драйвер Microsoft ODBC для SQL Server . Сведения о SQLNCLI, которые поставляется в качестве компонента ядра СУБД SQL Server (версии 2012–2019), см. в этом исключении жизненного цикла поддержки.

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

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

  • Connection

  • Сеть

  • Time

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

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

Поле SQLPERF Description
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.
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 Description
msExecutionTime Общее количество времени, затраченного драйвером на обработку после SQL_PERF_START, включая время на ожидание ответов от сервера.
msNetworkServerTime Общее количество времени, затраченного драйвером на ожидание ответов от сервера.

См. также

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