技术开发 频道

SQL语句性能调试与分析之执行计划

  【IT168 评论】一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作。我深信实践中得到的经验是最珍贵的,书本知识只是一个引导。这个部分将讲解一些性能分析工具,这些性能分许主要关注在执行计划。

  缓存执行计划

  SQL Server 2008提供了一些服务器对象来分析执行计划Sys.dm_exec_cached_plans: 包含缓存的执行计划,每个执行计划对应一行。Sys.dm_exec_plan_attributes: 这是一个系统函数,每一个执行计划都对应着一些属性,在这个系统函数中包含着这些属性。Sys.dm_exec_sql_text: 这是一个系统函数,返回文字格式的执行计划。Sys.dm_exec_query_plan: 这是一个系统函数,返回xml格式的执行计划。SQL Server 2008还提供了一个兼容性的视图sys.syscacheobject,这个视图中保存了所有的执行计划的信息。

  清除缓存

  在进行性能分析的时候有时候需要清除缓存以便进行下一次分析。SQL Server提供了一些工具来清除缓存的性能数据。使用下面的语句来完成这些任务。

  清除全局缓存使用下面的语句:

  DBCC DROPCLEANBUFFERS;

  从全局缓存中清除执行计划,使用下面的语句:

  DBCC FREEPROCCACHE;

  清除某一个数据库中的执行计划,使用下面的语句:

  DBCC FLUSHPROCINDB(<db_id>);

  清除一个特定的执行计划使用下面的语句:

  DBCC FREESYSTEMCACHE(<cachestore>);

  可以使用’ALL’,pool_name,’Object Plan’,’SQL Plans’,’Bound Trees’作为输入参数。’ALL’参数标明要清除所有的缓存,pool_name的值表明要清除的一个缓存池的名字。’Object Plans’清除对象计划(例如存储过程,触发器,用户定义函数等等)。’SQL Plans’用来清除要立即执行的语句。’Bound Trees’定义清除视图,约束等的缓存。

  注意:在使用这些语句清除缓存之前要想清楚,特别是在生产环境。这些对性能有很大的影响。清除这些缓存之后SQL Server需要从数据页中重新读取数据。并且SQL Server需要重新生成新的执行计划。因此在清除之前要想清楚这些对生产或者测试环境的影响。

  动态的管理对象

  SQL Server 2005引入了动态管理对象,例如DMV,DMF。SQL Server 2008中添加了新的对象,新的属性。这些饱含非常有用的信息,利用这些信息可以监视SQL Server,诊断问题,进行性能监视。要仔细研究这些对象会很耗时。这里只是列举一些常用的。

  统计IO

  统计IO是是一个session选项。它返回域当前执行的语句相关的I/O信息。要使用这个选项首选清除数据缓存:DBCC DROPCLEANBUFFERS;

  然后运行下面的代码来打开这个选项:SET STATISTICS IO ON;SELECT orderid, custid, empid, shipperid, orderdate, fillerFROM dbo.OrdersWHERE orderdate >= '20060101'AND orderdate < '20060201';

  最后可以得到类似下面的信息:(21226 row(s) affected)Table 'Orders'. Scan count 1, logical reads 537, physical reads 3, read-ahead reads 549, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

  从输出信息中我们可以看到在执行计划中有多少次获取表(Scan count);多少次读取缓存(logical reads);多少次读取硬盘(physical reads 俺的read-ahead reads);多少次读取大的对象(lob physical reads , log read-ahead reads)。使用下面的语句来关闭这个选项:SET STATISTICS IO OFF;

  统计运行时间

  STATISTICS TIME是一个用来返回CPU时钟时间的session选项。它返回语法分析,编译,执行的时间。要使用这个选项首选要清除执行计划缓存。

  DBCC DROPCLEANBUFFERS;
  DBCC FREEPROCCACHE;

  运行下面的语句来打开相应的选项:

  SET STATISTICS TIME ON;

  运行下面的语句:

    SELECT orderid, custid, empid, shipperid, orderdate, 
    filler FROM dbo.Orders WHERE orderdate >= '20060101' 
    AND orderdate < '20060201';

  得到下面的信息:

  SQL Server parse and compile time:
  CPU time = 0 ms, elapsed time = 4 ms.
  SQL Server Execution Times:
  CPU time = 46 ms, elapsed time = 544 ms.

  从这些信息中可以获得执行这个语句时候的CPU时钟时间,编译时间,运行时间。运行下面的语句可以关闭这个选项:

  SET STATISTICS TIME OFF;

  当需要分析一个单独的语句的性能的时候这个选项非常有用。当需要使用批处理的模式来运行语句的时候需要度量会有所不同。在查询之前保存SYSDATETIME函数的值,并写入到一个表中。注意这个函数返回的时间格式是DATETIME2,可以精确到100纳秒。这个函数的准确性取决于计算机硬件和操作系统版本。因为这个函数会调用GetSystemTimeAsFileTime()这个WindowsAPI。需要统计时间的时候可以重复地运行请求语句,然后记录下需要的时间。

0
相关文章