分析SQL Server计划缓存

提出问题:
     
对于任何系统而言,缓存机制都起着至关重要的作用,关系数据库也是如此。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中执行的结果:
355374_200901202301351.jpg

对于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中执行的结果:
355374_200901202302051.jpg

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

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

 

fj.png截图1232461846.jpg

fj.png截图1232462028.jpg

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

转载于:http://blog.itpub.net/355374/viewspace-541567/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值