技术开发 频道

查询执行的统计信息


【IT168技术文档】

  了解DMV统计信息

  在我开始讨论怎样收集执行统计信息之前,我想回顾一些关于DMV的基本信息。在SQL Server 2005中,Microsoft 推出了一些叫做DMV的系统视图。这些视图使你可以探察SQL Server 以确定是否健康、诊断问题,或是查看一个SQL Server 实例的操作信息。

  DMV统计信息是在SQL Server 运行时收集的,并在每次SQL Server 启动时重置。对某个DMV的统计还可以是在你删除了它们的组件后重新创建时进行重置。对于像存储过程、表之类的对象确实是这样的。对于其它的DMV信息可以通过运行DBCC命令来重置。

  当你使用任何DMV时,你要记下来收集DMV信息SQL Server 花费多长时间,以确定从DMV返回数据的有用性是多少。如果SQL Server 只启动了一小段时间,那么你可能不想使用一些DMV统计信息,因为它们不能显示一个实例可能遇到的真实工作负载相关的取样。而且SQL Server 只能维护这么多的信息,所以一些信息可能会在SQL Server 执行管理任务时丢失。因此,如果SQL Server 启动了很长时间,那么有可能一些统计信息会被重写。

  因此无论什么时候你使用DMV,当你查看通过SQL Server2005DMV返回的信息时都要记住这些要点。当你确定从DMV获得的信息是准确而完整的时候,只修改数据库或应用程序代码。

  使用sys.dm_exec_query_stats DMV 统计信息

  sys.dm_exec_query_stats DMV 返回一个SQL Server 2005实例中每一个TSQL语句查询的统计信息。这个DMV会返回运行在一个实例上的TSQL语句的一些有用统计信息,像执行计数、CPU使用数量、 I/O 的使用数量,等等。你可以阅读SQL Server在线书籍以查找关于当你运行这个DMV时所返回的所有变量字段的更详细的信息。

  当你从sys.dm_exec_query_stats DMV选择信息时,它会返回大量的统计信息,但是它不会给你与所显示的统计信息相关的SQL查询文本。要获得与统计信息相关的SQL查询文本,你需要将 sys.dm_exec_query_stats DVM记录集合和从sys.dm_exec_sql_text 动态管理功能(DMF)返回的字段连接起来,其如下所示:
SELECT * FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(sql_handle)
  在这我使用了CROSS APPLY 操作器来连接sys.dm_exec_query_stats DMV 和sys.dm_exec_sql_text 表值的DMF。这个CROSS APPLY 操作器使你可以将一个集合和一个函数连接起来。这个操作器使用左边的集合中每一行记录的一个字段值,然后使用这个值作为右边函数的输入。每次DMF函数返回任何信息时都会在最后的结果集中生成一条包含了左边字段和右边函数返回字段的记录。在这个例子中,CROSS APPLY操作器使用从sys.dm_exec_query_stats记录获得的“sql_handle”值连接了从 sys.dm_exec_query_stats 获得的记录和从sys.dm_exec_sql_text DMF获得的输出。

  确定批处理文件中的语句

  从sys.dm_exec_sql_text DMF返回的SQL 查询文本可以是一个存储过程、一个单独的TSQL语句,或是一系列语句。这个DMF返回了一个TSQL批处理文件中经常涉及的内容。所以实际上上面的 SELECT语句只连接了从一个单独语句(sql_handle)返回的统计信息和它所关联的SQL批处理文件。因此你需要作些工作来获得查询统计信息所应用的实际语句。要获得与这个查询语句关联的单独语句,你需要使用sys.dm_exec_query_stats DMF 的“offset”字段值。下面的代码使用这些offset值返回了与SQL查询统计信息的每一个集合相关联的单独TSQL语句:
SELECT SUBSTRING(text, -- starting value for substring CASE WHEN statement_start_offset = 0 OR statement_start_offset IS NULL THEN 1 ELSE statement_start_offset/2 + 1 END, -- ending value for substring CASE WHEN statement_end_offset = 0 OR statement_end_offset = -1 OR statement_end_offset IS NULL THEN LEN(text) ELSE statement_end_offset/2 END - CASE WHEN statement_start_offset = 0 OR statement_start_offset IS NULL THEN 1 ELSE statement_start_offset/2 END + 1 ) AS TSQL, * FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(sql_handle);
0
相关文章