【转】分析SQL Server计划缓存

http://www.cio360.net/Page/1808/InfoID/291578/SourceId/11281/PubDate/2009-02-03/Default.aspx#pager

SQL Server 7.0发布的版本之前,计划缓存是用于SQL Server的整个内存的单独可配置缓存区域。只有存储过程缓存在缓存的那个部分。由于这个原因,它被叫做程序缓存,在SQL Server 7.0和后面的版本中,计划缓存不是SQL Server内存单独的一个部分。现在SQL Server 是用一个非常动态的集成内存管理和缓存管理机制。

下面的脚本用于SQL Server 2000和前面的版本。它将提供SQL Server 计划缓存的内容和使用频率。


下面是SQL Server 2000脚本#1的部分结果集。

分析SQL Server计划缓存

图一

对于SQL Server 2005和它更新的版本,DMV已经被引进来获得这一信息。因此要得到缓存计划的内容和使用统计数据,你可能要使用下面的DMV脚本。

分析SQL Server计划缓存

下面是SQL Server 2005脚本#2的部分结果集。SQL Server 7.0的整个内存的单独可配置缓存区域。只有存储过程缓存在缓存的那个部分。由于这个原因,它被叫做程序缓存,在SQL Server 7.0和后面的版本中,计划缓存不是SQL Server内存单独的一个部分。现在SQL Server 是用一个非常动态的集成内存管理和缓存管理机制。

和前面的版本。它将提供SQL Server 计划缓存的内容和使用频率。

脚本#1的部分结果集。

和它更新的版本,DMV已经被引进来获得这一信息。因此要得到缓存计划的内容和使用统计数据,你可能要使用下面的DMV脚本。

分析SQL Server计划缓存

图二

上述脚本以及它们的描述所使用的整个领域如下:

分析SQL Server计划缓存

下面是SQL Server 2005脚本#2的部分结果集。

面是SQL Server 2005脚本#2的部分结果集。

分析SQL Server计划缓存

利 用上述脚本你可以看到SQL Server中的对象和它们的使用频率。记住对于SQL Server 2000,你需要使用系统表syscacheobjects而对于SQL Server 2005和更新的版本,主要使用DMV sys.dm_exec_cached_plans

当测试或者解决问题时,你可能需要清除计划缓存。你可以使用下面两种命令来达到目的。

     Script # 3: 清除整个SQL Server计划缓存 DBCC FREEPROCCACHE

GO

Script #4: 清除某个特定数据库的SQL Server 计划缓存

DBCC FLUSHPROCINDB ()

GO

/*

You can get DBID through following command

Select dbid from sysdatabases where name = <'DBName'>

*/

  除了上面的命令,下面的操作也将刷新整个计划缓存而新批需要新的计划。

分离任何数据库

SQL Server 2005或更高版本中升级任何数据库到兼容性级别90或者更高

针对任何数据库运行 ALTER DATABASE ... MODIFY FILEGROUP 命令

运行 ALTER DATABASE ... COLLATE来修改任何数据库的校对

用下面任何一个命令来更改一个数据库将会把缓存在具体数据库中的所有计划都删除掉。

ALTER DATABASE ..... MODIFY NAME

ALTER DATABASE ..... SET ONLINE

ALTER DATABASE ..... SET OFFLINE

ALTER DATABASE ..... SET EMERGENCY

下面的操作也会删除一个具体数据库的缓存计划。

删除一个数据库

数据库自动关掉

这是与在这里提及没有一种方法可以把一个单独的查询计划从SQL 2005和更低版本的缓存中删除有关,但是在SQL 2008中现在是可能的。

 

原文地址:https://www.cnblogs.com/huige1004/p/2267746.html