缓存执行计划
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需要重新生成新的执行计划。因此在清除之前要想清楚这些对生产或者测试环境的影响。
统计运行时间
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。需要统计时间的时候可以重复地运行请求语句,然后记录下需要的时间。