Sql查询过程 数据库
当执行一个Sql语句或者存储过程时, Sql Server的大体过程是缓存
1. 对查询语句进行分析,将其生成逻辑单元,并进行基本的语法检查性能
2. 生成查询树(会将查询语句中全部操做转换为对基表的操做,好比将视图转换为基表查询)优化
3. 生成执行计划(针对查询树会生成不少不一样的执行计划)spa
4. 查询优化器基于每一个执行计划的查询成本和数据库中的统计信息,选择一个最优执行计划code
5. 最优执行计划会被缓存在数据库的缓存池中。当再次执行相同Sql语句时,缓存的执行计划会被直接使用。这样能够提升性能。xml
查看缓存执行计划DMV blog
经过sys.dm_exec_cached_plans能够查询到当前系统缓存的执行计划。好比:以下代码能够查询缓存的全部为存储过程生成的最优执行计划内存
select * from sys.dm_exec_cached_plans where objtype = 'Proc'
查询结果中显示了该执行计划被重复使用的次数。io
注:普通的存储过程是在第一次被执行的的时候才会被编译,而后生成执行计划并缓存。
经过上面对查询过程的描述,咱们经过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. 而当数据库内存不足时,也会经过特定的机制将使用频率低的执行计划从缓存中清除。