SQL 2005缓存计划小结

缓存计划可以被分成两类:编译的计划和执行上下文。前者是对所有用户共享的,后者是针对某个特定用户的,它包含了某个用户执行此计划时的具体参数等相关的信息。编译的计划有四种类型,可以通过下面的语句进行查看:

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


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

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

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


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


如果是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包含了某计划的一些属性信息,下面我们试验一下改变执行环境后为同一批命令生成多个执行计划,执行下面的语句:

我得到的结果如下:

时间: 2024-08-17 21:38:11

SQL 2005缓存计划小结的相关文章

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述   了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要.   目录  概述  基础概念  怎样缓存执行计划  SQL Server自动删除执行计划  重新编译执行计划  测试  执行计划相关系统视图  手动清空缓存执

一步一步教你创建SQL 2005计划任务应用图解教程_mssql2005

使用sql的计划任务可以处理一些特殊环境的数据,除了使用windows系统的计划任务来定时处理,不过要配合程序才行,有些事情可以直接使用sql本身的计划任务,更方便,所以本文图解一下Sql2005计划任务的创建使用. 在SQL server2005创建计划任务具体步骤如下:首先要确认 sql server agent服务启动,如此服务被停止,则不能创建.然后,以数据库管理员身分登录数据库服务器,在维护计划上单击右键 如下图示: 选择新建维护计划,输入计划名字 然后,选择计划任务执行时间   点击

教你如何看懂SQL Server查询计划_MsSql

对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题,因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Server的认识有限,如有错误,也恳请您在发现后及时批评指正. 首先,打开[SQL Server Management Studio],输入一个查询语句看看SQL Server是如何显示查询计划的吧. 说明:本文所演示的数据库,是我为一个演示程序专用准备的数据库,可以在此网页中下载. select v.O

教你如何看懂SQL Server查询计划

对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题,因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Server的认识有限,如有错误,也恳请您在发现后及时批评指正. 首先,打开[SQL Server Management Studio],输入一个查询语句看看SQL Server是如何显示查询计划的吧. 说明:本文所演示的数据库,是我为一个演示程序专用准备的数据库,可以在此网页中下载. select v.O

引用:初探Sql Server 执行计划及Sql查询优化

原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之----探索MSSQL执行计划   作者:no_mIss   最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划.   网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚

ORACLE从共享池删除指定SQL的执行计划

Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划,这样在特殊情况下,就避免你要将整个SHARED POOL清空的危险情况.例如某个SQL语句由于优化器产生了错误的执行计划,我们希望优化器重新解析,生成新的执行计划,必须先将SQL的执行计划从共享池中刷出或将其置为无效,那么优化器才能将后续SQL进行硬解析.生成新的执行计划.这在以前只能使用清空共享

使用 EXPLAIN PLAN 获取SQL语句执行计划

     SQL查询语句的性能从一定程度上影响整个数据库的性能.很多情况下,数据库性能的低下差不多都是不良SQL语句所引起.而SQL语句的执行 计划则决定了SQL语句将会采用何种方式从数据库提取数据并返回给客户端,本文描述的将是如何通过EXPLAIN PLAN 获取SQL语句执行计划来获 取SQL语句的执行计划. 一.获取SQL语句执行计划的方式     1. 使用explain plan 将执行计划加载到表plan_table,然后查询该表来获取预估的执行计划      2. 查询动态性能视图

Oracle9iPL/SQL编程的经验小结_oracle

正在看的ORACLE教程是:Oracle9iPL/SQL编程的经验小结.平时在PL/SQL中的编程中遇到一些问题,这里以问答的形式来进行把它们总结下来,以供大家分享. 1.当需要向表中装载大量的数据流或者需要处理大量的数据流的时候,能否使用管道提高处理效率? 管道函数对于改善并行查询的性能非常方便,它加快往表中加载数据的速度.管道函数的使用总结如下两点: 每当在查询里使用PL/SQL函数时,该查询将被序列化,即一个处理器只能运行一个查询实例,那么在这种情况下不可能使用并行查询(比如在数据仓库中要

【OUTLINE】使用Oracle Outline技术暂时锁定SQL的执行计划

  Oracle的Outline技术可以在特殊情况下保证执行计划的稳定性.在极端情况下可以使用此项技术实现暂时锁定执行计划的目的.  主要使用场景如下:  ①短时间内无法完成SQL的优化任务,此时可以使用outline暂时锁定SQL执行计划:  ②在CBO优化模式下,当统计信息出现问题时,会导致执行计划出现异常变化,此时可以使用outline暂时调整SQL执行计划:  ③由于数据库的bug导致SQL的执行计划出现异常,使用outline锁定执行计划.   记录一下关于outline的使用方法,供