加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL 2005缓存计划小结

发布时间:2016-09-16 00:55:37 所属栏目:MsSql教程 来源:站长网
导读:缓存计划可以被分成两类:编译的计划和执行上下文。前者是对所有用户共享的,后者是针对某个特定用户的,它包含了某个用户执行此计划时的具体参数等相关的信息
缓存计划可以被分成两类:编译的计划和执行上下文。前者是对所有用户共享的,后者是针对某个特定用户的,它包含了某个用户执行此计划时的具体参数等相关的信息。编译的计划有四种类型,可以通过下面的语句进行查看:

SELECT *
FROM sys.dm_os_memory_cache_counters
WHERE name IN ('Object Plans', 'SQL Plans',
'Bound Trees', 'Extended Stored Procedures');

SQL 2005缓存计划小结

这四类分别对应于Object Plans(存储过程、函数、触发器),SQL Plans(即席查询、自动参数化、SP_EXECUTESQL执行的语句),Bound Trees(生成计划时代数化阶段所生成的结构),Extended Stored Procedures(扩展存储过程)。

执行上下文被存储于称为SQL Manager Cache (SQLMGR)的地方。如果缓冲区到达上限时,SQLSERVER会先释放掉SQLMGR这部分的内存,因为它们的编译成本是0。而编译的计划成本会被减半,如果成本到达0后也会被释放。

SQL2005的过程缓存是动态分配的,它的最大大小由下面的公式计算得到:

SQL 2005缓存计划小结

这里所指的visible target memory是当使用DBCC MEMORYSTATUS命令时在Buffer Counts的结果集中的Visible行返回的大小。如下图所示:

SQL 2005缓存计划小结

如果是64位的操作系统Target和Visible两者是相等的。Target是系统的可见内存和SQLSERVER最大可用内存两者中较小的那个。如果是32位系统,当设置了/3GB启动参数此值最大为3G,否则最大为2G。

如果32位系统中使用了多于4G的内存时,假设你为SQLSERVER配置了AWE。则Target和Visible就不会再相等了。过程缓存是不能存放于AWE内存中的。

假设你在32位操作系统中运行 SQLSERVER2005SP2,系统中有16G内存。你为SQLSERVER配置了AWE,并且考虑到有SSRS、SSIS、FULLTEXT等SQL服务,你设置SQLSERVER引擎的最大可用内存为12G。此时使用DBCC MEMORYSTATUS命令应该看到Target的大小应该是1572864。因为Buffers列的值是代表缓冲区页面的数量,每页的大小为8K。因此12G的话应该是12*1024*1024/8=1572864个缓冲页面。而此时的Visible是不等于Target的,假设当前Visible的值是2G。则过程缓存的最大大小就是2*0.75=1.5G。

如果是在64位系统中,则上面的计算公式为4*0.75+8*0.1=3.8G。我们看到SQL2005的SP2比SP1对过程缓冲区的大小做了更多的限制,这是为了防止因为有大量的缓存计划而导致与数据缓存争抢内存。

那么一个批命令会不会有多个执行计划呢?只有在改变了执行时的环境时才会生成另一个执行计划。视图sys.dm_exec_plan_attributes包含了某计划的一些属性信息,下面我们试验一下改变执行环境后为同一批命令生成多个执行计划,执行下面的语句:

我得到的结果如下:

SQL 2005缓存计划小结

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读