标签归档:执行计划

mssql sqlserver 从sql引擎的缓存中获取带参数的已编译的sql执行计划脚本的方法分享


摘要:
下文讲述从sql引擎中获取缓存中带参数的执行计划的方法分享,如下所示:
实验环境:sql server 2008 R2


在sqlserver数据库中,我们经常听同事讲:

1.今天查询好慢好慢,当我们进入系统运行查询时,发现速度非常快(或我们把脚本放入查询分析器运行,速度也非常快)
2.这个查询有时候好慢,有时候好快这些疑惑时.

此时我们需获取缓存中的执行计划,然后对相关查询所涉及的执行计划进行分析诊断,达到对sql运行提速的方法,如下所示:

   select 
b.[text] as [脚本信息]
,db_name(b.dbId) as [数据库名称]
,object_name(b.objectId) as [对象名称]
,d.query_Plan as [xml执行计划] ---双击可查看详细执行计划
,a.creation_time as [创建时间]
,a.last_execution_time as [最后执行时间]
 
FROM sys.dm_exec_query_stats a
CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) b
CROSS APPLY 
sys.dm_exec_text_query_plan(a.plan_handle, 
a.statement_start_offset, a.statement_end_offset) c
CROSS APPLY sys.dm_exec_query_plan(a.plan_handle) d
WHERE b.ENCRYPTED <> 1 

mssql_sqlserver_执行计划_8529

mssql_sqlserver_执行计划_8529



注意事项:
在查询出来的结果上,双击相应的执行计划,查阅执行计划的相关信息

执行计划何时会被重新生成


摘要:
下文讲述执行计划被重新生成的场景



执行计划简介

执行计划:告诉服务器如何去执行这条sql脚本。
db服务器收到一条sql脚本,需要做一个动作,就是找到正确的执行方法,这个方法我们称之为“执行计划”。
————————————————-
计算机会对sql脚本进行分析,告诉sql脚本应该遍历表,还是试用索引查找表 还是连接表,
然后对输出结果集,进行如何计算呢,等等一系列操作,
我们这些形成的操作方式称之为“执行计划”
——————————————
执行计划:db服务器所形成的执行计划是db服务器认为最优的操作sql的方法。



执行计划重新生成的条件

随着数据库中的数据库或其它更改,以前的执行计划,已经不适用当前的数据库了,下文将讲述“执行计划”被重新生成的条件:
1 .执行计划所涉及的索引发生任何变化时(索引重编译 索引碎片处理 索引重建 索引删除等)
2 .执行计划所涉及的统计信息发生变化时
3 .执行计划所涉及的存储过程被重编译
4 .对表或视图进行修改操作
5 .对视图进行重建操作
6 .表内行数发生大变化时(统计信息也会发生变化)
7 .对表进行大量的insert update delete 操作时
8 .db服务器内存严重不足时,导致执行计划缓存自动消失