提出问题:
对于任何系统而言,缓存机制都起着至关重要的作用,关系数据库也是如此。SQL Server采用缓存机制来优化性能,而无需用户的任何操作。有许多种方法将计划或数据添加到SQL Server缓存或从缓存中移出,不过这些方法仅适用于测试或排查故障,铭记缓存机制的重要性,那么在SQL Server中我们如何获得缓存计划的使用统计信息呢?
解决办法:
在SQL Server7.0之前版本中,计划缓存是SQL Server内存区域内的独立内存,仅有存储过程被放入该缓存区域中,即常说的“过程缓存”,而在SQL Server 7.0之后的版本中,计划缓存不再作为独立的内存存在于SQL Server内存中。此时SQL Server采用一种“动态集成内存管理”和“缓存管理机制”的方法来管理缓存。
以下脚本适用于SQL Server 2000,它描述了SqL Server计划缓存的内容。
脚本1:获取SQL Server计划缓存内容 |
USE Master |
下图是脚本在SqL Server 2000中执行的结果:
对于SqLServer 2005而言,引入了动态管理视图(DMVs),使用DMVs可以获取类似的内容,下面是脚本:
脚本2:获取SQL Server计划缓存内容 |
USE master GO |
下面对图中字段信息作一简要描述:
UseCounts: 自被缓存以后该缓存对象使用次数
RefCounts: 其它缓存对象引用该对象的次数
CacheObjType: 计划缓存的对象类型,
SQL Server 2000有如下类型:
1)Compiled Plan
2)Executable Plan
3)Parse Tree
4)Cursor Parse Tree
5)Extended Stored Procedure
SQL Server 2005有如下类型:
1)Compiled Plan
2)Parse Tree
3)Extended Stored Procedure
4)CLR Compiled Functions
5)CLR Compiled Procedures
ObjType:相对应原数据库对象类型,有如下类型:
1)Stored Procedure
2)Prepared statement
3)Ad hoc query
4)ReplProc(replication procedure)
5)Trigger
6)View
7)Default
8)User Table
9)System table
10)Check
11)Rule
注意:SQL Server 2005之前的版本中,ad hoc查询是很少被缓存。从SQL Server 2005以后,ad hoc查询则可以缓存,仅当完全匹配时重用或提供的参数应当保持一致。
DatabaseName:缓存对象所属的数据库,对于同一批的计划该列显示为NULL
SQL:计划缓存中的SQL代码
通过以上脚本,您可以简单地了解SqL Server缓存中经常使用的缓存对象,记住一点:SQL Server 2000中你需要使用系统表syscacheobjects,而在SqL Server 2005则使用动态管理视图sys.dm_exec_cached_plans。
当在测试或排除故障时可能需要清除计划缓存,可以使用以下两条命令:
脚本3:清除整个计划缓存 |
DBCC FREEPROCACHE |
脚本4:从缓存中清除给定数据库的计划缓存 |
DBCC FLUSHPROCINDB() |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/355374/viewspace-541567/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/355374/viewspace-541567/