ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 分析SQL Server计划缓存

分析SQL Server计划缓存

原创 Linux操作系统 作者:bigholy 时间:2009-01-20 22:58:01 0 删除 编辑

提出问题:
     
对于任何系统而言,缓存机制都起着至关重要的作用,关系数据库也是如此。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
GO
SELECT
UseCounts, RefCounts,CacheObjtype, ObjType, DB_NAME(dbid) as DatabaseName, SQL
FROM syscacheobjects
ORDER BY dbid,usecounts DESC,objtype
GO

下图是脚本在SqL Server 2000中执行的结果:


对于SqLServer 2005而言,引入了动态管理视图(DMVs),使用DMVs可以获取类似的内容,下面是脚本:

脚本2:获取SQL Server计划缓存内容

USE master
GO
SELECT UseCounts,RefCounts, Cacheobjtype, Objtype,
ISNULL(DB_NAME(dbid),'ResourceDB') AS DatabaseName, TEXT AS SQL
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
ORDER BY dbid,usecounts DESC;
GO

下图是脚本在SqL Server 2005中执行的结果:

下面对图中字段信息作一简要描述:

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
GO
脚本4:从缓存中清除给定数据库的计划缓存
DBCC FLUSHPROCINDB()
GO

 

截图1232461846.jpg

截图1232462028.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/355374/viewspace-541567/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 小知识:迭代器
下一篇: 存储过程与缓存
请登录后发表评论 登录
全部评论

注册时间:2008-11-08

  • 博文量
    43
  • 访问量
    84430