为什么 SQL Server 会自动删除手动创建的索引?

Zac*_*ott 5 sql-server-2008 sql-server

是什么导致 Microsoft SQL Server 自动删除手动创建的索引?我创建的每个索引都会在几个小时内删除。

这是我用来创建索引的代码。受影响的视图运行得更快。索引消失/在几个小时内被删除。受影响的视图运行缓慢或失败。

CREATE NONCLUSTERED INDEX IX_Tablename_fieldname 
ON dbo.Tablename (fieldname) 
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
      ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 18

SQL Server 不会自动*删除索引 - 也不会自动执行任何其他更改表、视图、函数、索引等结构的 DDL 语句。

如果您的索引确实被删除,那么某些用户或应用程序或作业正在执行此操作。

*:如果启用该选项,Azure 上的 SQL Server 可以自动删除索引。如果它们是重复的或已被使用 6 个月左右,它就会这样做。虽然不是 2008 版或任何其他桌面版本。


要找出谁或什么,您有多种选择:

  • 编写一个 DDL 触发器来捕获DROP INDEX语句(甚至禁止它们删除您的索引)。参见 Ken Kim 的回答。
  • SQL 跟踪
  • 启用审计
  • 使用 XEvents(扩展事件
  • 使用 SQL Profiler
  • 读取事务日志


小智 8

您可以设置 DDL 触发器来捕获创建/删除索引。

CREATE TRIGGER [DDLAuditTrigger] ON ALL SERVER
    FOR CREATE_INDEX, DROP_INDEX
Run Code Online (Sandbox Code Playgroud)

这是一篇关于howto的文章。 https://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/