我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为复用执行计划的性能比生成执行计划的性能要高很多,所以SqlServer的这一特性可以大大提高Sql语句的执行效率。特别是对于存储过程,因为存储过程的执行计划是在存储过程第一次执行的时候生成的,存储过程的执行计划生成后就会被缓存到SqlServer的执行计划列表中,如果以后存储过程再被执行,那么存储过程的执行计划就可以被复用(除非查询优化器认为该存储过程的执行计划已经过时,否则一般都会被复用),性能大大提升。

那么现在我们怎么才能知道执行的Sql语句是复用的SqlServer缓存的执行计划,还是重新生成的执行计划呢?

我们可以通过Sql Server Profiler这个工具来看到执行计划是否被查询优化器复用。

首先打开Sql Profiler,新建一个跟踪

然后在 事件选择 面板上选中 显示所有事件

然后在事件列表里面,选中 Stored Procedures 类别下的 SP:CacheHit SP:CacheMiss 事件,如果Sql Profiler中出现了SP:CacheHit事件表示SqlServer为查询语句复用了缓存中的执行计划,如果出现了SP:CacheMiss 事件表示SqlServer为查询语句重新生成了执行计划

接着我们随便执行一个Sql语句如下

select * from [dbo].[T_People]

从下图中我们发现在Sql Profiler出现了SP:CacheMiss 事件,因为我们是在SqlServer中第一次执行该查询,所以SqlServer的缓存列表中并没有该查询语句的执行计划,所以SqlServer为该查询语句重新生成了执行计划。

接着我们再次执行上面的查询语句,这一次Sql Profiler出现了SP:CacheHit  事件,说明SqlServer这次为查询语句复用了缓存中的执行计划,并没有重新生成执行计划。

使用如下语句可以清除SqlServer目前所有缓存的执行计划,为所有Sql语句重新生成执行计划,切记不要在客户生产环境上执行如下语句!

DBCC FREEPROCCACHE

所以通过Sql Profiler我们可以跟踪到执行的每条Sql语句是否重新生成了执行计划,从而知道对查询性能的影响是什么。对于SqlServer是否会为查询语句复用执行计划也是一个非常复杂的问题,诸如查询条件参数化这样的手段都可以增加执行计划的复用性,有兴趣的朋友可以参考下面三篇文章做详细了解,这三篇文章都详细地解释了SqlServer执行计划的复用机制,写的非常全面。

谈一谈SQL Server中的执行计划缓存(上)
谈一谈SQL Server中的执行计划缓存(下)
执行计划的重用

另外关于SqlServer缓存的执行计划何时会被删除找到了下面这篇网摘供参考

什么情况下会删除执行计划

在没有人工手动清除缓存的情况下,如果出现内存不足的情况下SQL Server会自动清除一部分没被利用到的缓存计划。

所有缓存的最大大小取决于max server memory的大小。

怎样判断需要删除的执行计划

果存在内存不足的情况,数据库引擎将使用基于开销的方法来确定从过程缓存中删除哪些执行计划。怎样确定一个执行计划的开销呢,对于一个第一次执行的执行计划SQL Server将它的开销值设为0,被多次执行过的执行计划SQL Server将它的开销值设置为原始编译开销,所以数据库引擎会重复检查每个执行计划的状态并将删除当前开销为零的执行计划。如果存在内存不足的情况,当前开销为零的执行计划不会自动被删除,而只有在数据库引擎检查该执行计划并发现其当前开销为零时,才会删除该计划。当检查执行计划时,如果当前没有查询使用该计划,则数据库引擎将降低当前开销以将其推向零。

数据库引擎会重复检查执行计划,直至删除了足够多的执行计划,以满足内存需求为止。如果存在内存不足的情况,执行计划可多次对其开销进行增加或降低。如果内存不足的情况已经消失,数据库引擎将不再降低未使用执行计划的当前开销,并且所有执行计划都将保留在过程缓存中,即使其开销为零也是如此。

重新编译执行计划

根据数据库新状态的不同,数据库中的某些更改可能导致执行计划效率降低或无效。SQL Server 将检测到使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:

•对查询所引用的表或视图进行更改(ALTER TABLE 和 ALTER VIEW)。

•对执行计划所使用的任何索引进行更改。

•对执行计划所使用的统计信息进行更新,这些更新可能是从语句(如 UPDATE STATISTICS)中显式生成,也可能是自动生成的。

•删除执行计划所使用的索引。

•显式调用 sp_recompile。

•对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。

•对于带触发器的表,插入的或删除的表内的行数显著增长。

•使用 WITH RECOMPILE 选项执行存储过程。

SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划的更多相关文章

  1. SQL Server中存储过程比直接运行SQL语句慢的原因

    原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以 ...

  2. SQL Server中一些有用的日期sql语句

    SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...

  3. postgres中几个复杂的sql语句

    postgres中几个复杂的sql语句 需求一 需要获取一个问题列表,这个问题列表的排序方式是分为两个部分,第一部分是一个已有的数组[0,579489,579482,579453,561983,561 ...

  4. 一个 Sql语句优化的问题- STATISTICS 统计信息

    前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看数据库里面的数据条数,数据量也不大,相关字段的一些索引也都有,可就是慢.于是找出具体的sql 语句出来分析,分页功能主要 ...

  5. 在mysql中修改表名的sql语句

    在使用mysql时,经常遇到表名不符合规范或标准,但是表里已经有大量的数据了,如何保留数据,只更改表名呢?可以通过建一个相同的表结构的表,把原来的数据导入到新表中,但是这样视乎很麻烦.能否简单使用一个 ...

  6. 获取SQLServer的最完整数据字典的SQL语句

    原文:获取SQLServer的最完整数据字典的SQL语句 原创于2008年06月18日,2009年10月18日迁移至此. 获取SQLServer 的最完整数据字典的SQL 语句   其实网上已经流传了 ...

  7. SQL SERVER 一个SQL语句的执行顺序

    一个SQL 语句的执行顺序 1.From (告诉程序 来自哪张表  如果是表表达式 依旧是如此顺序) 2.Where(条件筛选  谓词筛选 ) 3.Group by(分组) 4.Having(分组   ...

  8. 查看oracle的sql语句历史记录和锁表的情况

    查看oracle的sql语句历史记录和锁表的情况 (2012-01-04 20:59:59) 转载▼ 标签: 杂谈 分类: database 查询sql的历史记录 select * from v$sq ...

  9. 查看 Laravel 的 SQL 语句的方法

    在使用 Laravel 的 Eloquent 进行数据查询的时候,很多小伙伴都想看到背后执行的 SQL 语句到底是什么样的,这小笔录就是解决这个小问题的: 在 Providers/AppService ...

随机推荐

  1. 面向对象世界里转转七(Liskov替换原则)

    前言:Liskov替换原则是关于继承机制的应用原则,是实现开放封闭原则的具体规范,违反了Liskov原则必然意味着违反了开放封闭原则.因此,有必要对面向对象的继承机制及其基本原则做以探索,来进一步了解 ...

  2. synchronized原理

    http://www.cnblogs.com/YDDMAX/p/5658607.html http://www.cnblogs.com/YDDMAX/p/5658668.html synzhroniz ...

  3. flex布局中flex-basis|flex-grow|flex-shrink

    flex布局中flex-basis|flex-grow|flex-shrink 整个才是正确的算法 flex-basis(基准值) 可以设置flex布局中容器的宽度,如果同时存在width属性,将把它 ...

  4. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件

    Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统  nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...

  5. 项目管理利器——Maven

    假设公司要开发一个新的Web项目,使用目前流行的struts2.spring.MyBatis进行新项目开发.那么接下来首先要进行的工作就是各个框架的jar包的下载.大家通常的做法是先到struts2的 ...

  6. UIImagePickerController

    1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;                 检查指定源是 ...

  7. The REST Objection

    HTTP 1.1 Standard http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

  8. Java定时任务Timer、TimerTask与ScheduledThreadPoolExecutor详解

     定时任务就是在指定时间执行程序,或周期性执行计划任务.Java中实现定时任务的方法有很多,本文从从JDK自带的一些方法来实现定时任务的需求. 一.Timer和TimerTask  Timer和Tim ...

  9. asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie;FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket

    我们在登陆成功后,使用下面的3种方法,都是同一个目的:创建身份验证票并将其附加到 Cookie, 当我们用Forms认证方式的时候,可以使用HttpContext.Current.User.Ident ...

  10. centos 6.4下的postgresql 9.2使用

    http://www.cnblogs.com/mchina/archive/2012/06/06/2539003.html