测试索引更改对执行计划的影响
---清空制定数据库执行计划
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在架构更改的时候通过检测执行计划已经对原先的执行计划进行了编译,所以在新的查询中还是使用了第一次查询的执行计划。
  如果有谁知道结果麻烦告知。
  总结

  如果文章对大家有帮助,希望大家能给个推荐,谢谢!!!