我们在sqlserver中执行的sql语句,定义的存储过程,触发器,视图等,sqlserver都会生成对应的执行计划并缓存起来,以达到快速查询的目的。那么我们要如何查看到sqlserver为我们缓存的所有的执行计划呢?利用
sys.dm_exec_cached_plans视图,我们就可以很方便的查看sqlserver缓存的执行计划,该计划被使用的次数,以及该计划占用的内存长度等,结合sys.dm_exec_sql_text函数,我们还可以快速的查询该执行计划对应的sql语句。
先看一下sys.dm_exec_cached_plans的解释或列说明:
解释:该视图针对Sql Server为了加快查询而缓存的每个查询计划都会返回一行。列说明:
列名 |
数据类型 |
说明 |
bucketid
|
int
|
存储桶 ID。该值指示从 0 到 1 的范围(目录大小)。目录大小是哈希表的大小。 |
refcounts
|
int
|
引用该缓存对象的其他缓存对象数。计数 1 为基数。 |
usecounts
|
int
|
自开始以来使用该缓存对象的次数。 |
pagesused
|
int
|
缓存对象消耗的内存页数。 |
cacheobjtype
|
nvarchar(34)
|
缓存中的对象类型。以下类型之一:
编译计划
可执行计划
分析树
扩展存储过程 |
memory_object_address
|
varbinary(8)
|
计划的内存地址。 |
objtype
|
nvarchar(16)
|
对象的类型。可以是下列类型之一:
Proc--存储过程
Prepared--预定义语句
Adhoc--即席查询
ReplProc--复制筛选过程
Trigger--触发器
View--视图
Default--默认值
UsrTab--用户表
SysTab--系统表
CheckCHECK--约束
Rule规则
|
plan_handle
|
varbinary(64)
|
内存中计划的标识符。该标识符是瞬态的 仅当计划保留在缓存中时,它才保持不变。 该值可以与
sys.dm_exec_query_plan 动态管理函数以及sys.dm_exec_plan_attributes 动态管理函数一同使用。
|
我们可以从上面的size_in_bytes列找出占用内存量大的执行计划,也可以找出命中率高的执行计划,即usecounts列值大的执行计划。
在这个视图中并没有返回每行执行计划对应的sql文本,我们可以通过下面sql来查询出对应的sql文本:
select p.*,[sqltext].[text]
FROM sys.dm_exec_cached_plans p
OUTER APPLY sys.dm_exec_sql_text(p.plan_handle) sqltext
N<