ODBC 驱动程序性能事件探查

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) 未随附:

  • 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 数据结构中,也可以记录在以制表符分隔的文件中。 包括以下几个类别的统计信息数据:

  • 应用程序配置文件

  • 连接

  • 网络

  • 时间

下表对 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)