测试索引更改对执行计划的影响
---清空制定数据库执行计划 DECLARE @DBID INT SET @DBID=DB_ID() DBCC FLUSHPROCINDB(@DBID); GO ---创建测试数据库 CREATE TABLE TPlan (ID INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(20) NOT NULL, Istate INT NOT NULL, Idate DATETIME DEFAULT(GETDATE()) ) GO ---创建索引 CREATE INDEX IX_TPlan_NAME ON TPlan (Name ) GO INSERT INTO TPlan(Name,Istate) VALUES('1',1),('2',2),('3',3) GO SELECT NAME FROM TPlan GO SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjects WHERE DBID=DB_ID() |
使用Profiler监控
使用SQL:StmtRecompile监控,如果是监控存储过程则使用:SP:Recompile
修改索引
在索引中添加字段
DROP INDEX [IX_TPlan_NAME] ON [dbo].[TPlan] WITH ( ONLINE = OFF )
GO
USE [Study]
GO
CREATE NONCLUSTERED INDEX [IX_TPlan_NAME] ON [dbo].[TPlan]
(
[Name] ASC
)
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]
GO
再执行查询
SELECT NAME FROM TPlan
测试增加字段对执行计划的影响
增加查询非相关字段
ALTER TABLE [dbo].[TPlan]
ADD Number INT
删除查询有关的索引也同样会导致执行计划重编译,这里就不截图贴出来了。
查看执行计划
SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjects
WHERE DBID=DB_ID()
执行计划中显示了该执行计划被调用了两次,在随机丛书中写的是会重新编译新的执行计划,如果是这样的话那这里的值应该是1才对。
猜测:SQL Server在架构更改的时候通过检测执行计划已经对原先的执行计划进行了编译,所以在新的查询中还是使用了第一次查询的执行计划。
如果有谁知道结果麻烦告知。
总结
如果文章对大家有帮助,希望大家能给个推荐,谢谢!!!