Sql Server中执行计划的缓存机制
Sql查询过程
当执行一个Sql语句或者存储过程时, Sql Server的大致过程是
1. 对查询语句进行分析,将其生成逻辑单元,并进行基本的语法检查
2. 生成查询树(会将查询语句中所有操作转换为对基表的操作,比如将视图转换为基表查询)
3. 生成执行计划(针对查询树会生成很多不同的执行计划)
4. 查询优化器基于每个执行计划的查询成本和数据库中的统计信息,选择一个最优执行计划
5. 最优执行计划会被缓存在数据库的缓存池中。当再次执行相同Sql语句时,缓存的执行计划会被直接使用。这样可以提高性能。
查看缓存执行计划DMV
通过sys.dm_exec_cached_plans可以查询到当前系统缓存的执行计划。比如:如下代码可以查询缓存的所有为存储过程生成的最优执行计划
select * from sys.dm_exec_cached_plans where objtype = 'Proc'
查询结果中显示了该执行计划被重复使用的次数。
注:普通的存储过程是在第一次被执行的的时候才会被编译,然后生成执行计划并缓存。
通过上面对查询过程的描述,我们通过Management Studio直接执行的语句的执行计划也会被缓存。
通过如下查询可以得到缓存的列表
select * from sys.dm_exec_cached_plans where objtype = 'Adhoc'
同时,通过查询sys.dm_exec_text_query_plan可以得到某个查询计划的详细信息。比如:以下代码可以查询上面所描述存储过程的执行计划的详情
declare @planHandle varbinary(64)
SELECT @planHandle = plan_handle from sys.dm_exec_cached_plans where bucketid = 6124
select * from sys.dm_exec_text_query_plan(@planHandle,0,-1)
结果如下:
query_plan列的值是描述执行计划详情的xml
执行计划的管理
1. 当数据库重启时会被清空。然后我们也可以通过执行DBCC FREEPROCCACHE来清空缓存。
2. 而当数据库内存不足时,也会通过特定的机制将使用频率低的执行计划从缓存中清除。
Sql Server中执行计划的缓存机制的更多相关文章
- SQL Server 优化-执行计划
对于SQL Server的优化来说,优化查询可能是很常见的事情.由于数据库的优化,本身也是一个涉及面比较的广的话题, 因此本文只谈优化查询时如何看懂SQL Server查询计划.毕竟我对SQL Ser ...
- 了解Sql Server的执行计划
前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句.但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性 ...
- SQL Server中执行Sql字符串,返回执行结果
今天遇到一个问题:想把sql字符串在SQL Server 中执行了,并获取执行的结果 ); SET @tablename='select @table3 = count(1) from UserVis ...
- SQL Server实际执行计划COST"欺骗"案例
有个系统,昨天Support人员发布了相关升级脚本后,今天发现系统中有个功能不能正常使用了,直接报超时了(Timeout expired)的错误.定位到相关相关存储过程后,然后在优化分析的过程中,又遇 ...
- 程序员眼中的 SQL Server-执行计划教会我如何创建索引?
先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...
- SQL Server-执行计划教会我如何创建索引
先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...
- SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例
开发人员遇到一个及其诡异的的SQL性能问题,这段完整SQL语句如下所示: declare @UserId INT declare @PSANo VAR ...
- SQL Server 中执行Shell脚本计算本地文件的内容大小
SQL Server 数据库中除了能执行基本的SQL语句外,也可以执行Shell脚本.默认安装后,SQL中的Shell脚本的功能是关闭的,需要手动打开, 执行以下脚本即可打开该功能. -- 允许配置高 ...
- SQL Server中执行正则表达式
总体方案:写function,再执行update语句. 一.查询函数 -- ============================================= -- Author: <l ...
随机推荐
- Python学习笔记:与Java 基础语法对比
闲着无聊学习下Python 的语法.由于我目前主要编程语言还是Java ,所以针对Python 的学习我主要是通过与Java 进行对比.我使用的是Python3,因此语法上也会遵循Python3 的规 ...
- Java面试知识点总结及解析
声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个 ...
- How to install tensorflow from source on ubuntu 18.04 64bit
1,install dependencies sudo apt-get install openjdk-8-jdk git python-dev python3-dev python-numpy py ...
- Python学习札记(二十七) 函数式编程8 偏函数
偏函数 NOTE 1.int()函数提供额外的base参数,默认值为10.如果传入base参数,就可以做N进制的转换: #!/usr/bin/env python3 import functools ...
- java 23种设计模式,一般情况下,常用的有哪些? 转载
原址:http://wangle.iteye.com/blog/196972 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式 ...
- 在 R 中使用 Python 字符串函数
sprintf( )函数很强大,但并非适用于所有应用场景.例如,如果一些部分在模板中多次出现,那么就需要多次写一样的参数.这通常会使得代码冗长而且难以修改:sprintf("%s, %d y ...
- Flyweight(享元)
意图: 运用共享技术有效地支持大量细粒度的对象. 适用性: 一个应用程序使用了大量的对象. 完全由于使用大量的对象,造成很大的存储开销. 对象的大多数状态都可变为外部状态. 如果删除对象的外部状态,那 ...
- Windows__书
1.<<Windows 网络与通信程序设计>> (第2版) 2. 3.
- Java 字节的常用封装
一. Java 的字节 byte (字节) 是 Java 中的基本数据类型,一个 byte 包含8个 bit(位),byte 的取值范围是-128到+127. byte 跟 Java 其他基本类型的关 ...
- 读underscore
最近在拜读只有1700行(含注释)代码的Underscore.js 1.9.1,记录一些东西 (参考https://underscorejs.org/underscore.js,https://git ...