欢迎投稿

今日深度:

SQL Server 执行计划缓存(1)(2)

测试

  1. --1.缓存的每一个对象返回一行,包括缓存计划的类型、缓存引用的对象、缓存计划占用的空间、被使用次数、以及创建时间等 
  2. SELECT * FROM sys.syscacheobjects; 
  3. --2.缓存的每个查询计划返回一行,包括执行计划被使用的次数、执行计划的大小、内存地址、执行计划的类型、语句等 
  4. SELECT * FROM sys.dm_exec_cached_plans; 
  5. GO 
  6. ---3.返回由指定的 sql_handle 标识的 SQL 批处理的文本 
  7. /*其中sql_handle来自: 
  8. sys.dm_exec_query_stats 
  9. sys.dm_exec_requests 
  10. sys.dm_exec_cursors 
  11. sys.dm_exec_xml_handles 
  12. sys.dm_exec_query_memory_grants 
  13. sys.dm_exec_connections 
  14. plan_handle来自:sys.dm_exec_cached_plans 
  15. */  
  16. SELECT * FROM sys.dm_exec_sql_text(sql_handle | plan_handle); 
  17. GO 
  18. --4.以 XML 格式返回计划句柄指定的批查询的显示计划,主要接受来自sys.dm_exec_cached_plans的plan_handle句柄 
  19. SELECT * FROM sys.dm_exec_query_plan(plan_handle); 
  20. GO 
  21. --5.每个计划属性返回一行,主要接受来自sys.dm_exec_cached_plans的plan_handle句柄 
  22. SELECT * FROM sys.dm_exec_plan_attributes(plan_handle); 
  23. GO 
  24. --6.针对每个 Transact-SQL 执行计划、公共语言运行时 (CLR) 执行计划和与计划关联的游标返回一行,,主要接受来自sys.dm_exec_cached_plans的plan_handle句柄 
  25. SELECT * FROM sys.dm_exec_cached_plan_dependent_objects(plan_handle); 
  26.  
  27. --7.返回缓存查询计划的聚合性能统计信息。缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。在从缓存删除计划时,也将从该视图中删除对应行。*/ 
  28. --该系统视图针对每一个缓存中的执行计划统计其执行时间、物理、逻辑操作等信息 
  29. SELECT * FROM sys.dm_exec_query_stats 

手动清空缓存执行计划

  1. ---清空制定数据库执行计划 
  2. DECLARE @DBID INT 
  3. SET @DBID=DB_ID() 
  4. DBCC FLUSHPROCINDB(@DBID); 
  5. GO 
  6.  
  7. ---创建测试数据库 
  8. CREATE TABLE TPlan 
  9. (ID INT PRIMARY KEY IDENTITY(1,1), 
  10. Name NVARCHAR(20) NOT NULL
  11. Istate INT NOT NULL
  12. Idate DATETIME DEFAULT(GETDATE()) 
  13. GO 
  14. ---创建索引 
  15. CREATE INDEX IX_TPlan_NAME ON TPlan 
  16. (Name 
  17. GO 
  18. INSERT INTO TPlan(Name,Istate) 
  19. VALUES('1',1),('2',2),('3',3) 
  20.  
  21. GO 
  22. SELECT NAME FROM TPlan 
  23. GO 
  24. SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjects 
  25. WHERE DBID=DB_ID() 

使用Profiler监控

使用SQL:StmtRecompile监控,如果是监控存储过程则使用:SP:Recompile

修改索引

在索引中添加字段

  1. DROP INDEX [IX_TPlan_NAME] ON [dbo].[TPlan] WITH ( ONLINE = OFF ) 
  2. GO 
  3. USE [Study] 
  4. GO 
  5. CREATE NONCLUSTERED INDEX [IX_TPlan_NAME] ON [dbo].[TPlan]  
  6.     [NameASC 
  7. INCLUDE ( [Istate]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY
  8. GO 

再执行查询

  1. SELECT NAME FROM TPlan 

SQL Server 执行计划缓存

测试增加字段对执行计划的影响

增加查询非相关字段

  1. ALTER TABLE [dbo].[TPlan] 
  2. ADD Number INT 

SQL Server 执行计划缓存

删除查询有关的索引也同样会导致执行计划重编译,这里就不截图贴出来了。

查看执行计划

  1. SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjects 
  2.  
  3. WHERE DBID=DB_ID() 

执行计划中显示了该执行计划被调用了两次,在随机丛书中写的是会重新编译新的执行计划,如果是这样的话那这里的值应该是1才对。

SQL Server 执行计划缓存

猜测:SQL Server在架构更改的时候通过检测执行计划已经对原先的执行计划进行了编译,所以在新的查询中还是使用了第一次查询的执行计划。

博文地址:http://www.cnblogs.com/chenmh/archive/2015/04/20/4438086.html
 




www.htsjk.Com true http://www.htsjk.com/shujukujc/19383.html NewsArticle 测试 --1.缓存的每一个对象返回一行,包括缓存计划的类型、缓存引用的对象、缓存计划占用的空间、被使用次数、以及创建时间等 SELECT * FROM sys.syscache...
评论暂时关闭