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 字段 | DESCRIPTION |
|---|---|
| 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后的用户事务数,包括回滚。 当 ODBC 应用程序使用 SQL_AUTOCOMMIT_ON 运行时,每个命令都被视为事务。 |
| 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)数据包数。 大型命令可以采用多个缓冲区,因此,如果将大型命令发送到服务器并填充六个数据包,则 ServerRndTrips 将递增 1,BuffersSent 递增 6。 |
| BuffersRec | 应用程序开始使用驱动程序后从 SQL Server 接收的 TDS 数据包数。 |
| BytesSent | 应用程序开始使用驱动程序后,在 TDS 数据包中发送到 SQL Server 的数据字节数。 |
| BytesRec | 应用程序开始使用驱动程序后从 SQL Server 接收的 TDS 数据包中的数据字节数。 |
时间统计信息
| SQLPERF 字段 | DESCRIPTION |
|---|---|
| msExecutionTime | 驱动程序在SQL_PERF_START后花费的累计时间,包括等待服务器回复的时间。 |
| msNetworkServerTime | 驱动程序等待来自服务器的回复的累计时间。 |