SQL Server自动索引更改(我的索引上的过滤器已消失)

时间:2018-05-07 18:46:44

标签: sql-server indexing

我正在使用SQL Server 2008

我知道如果更改视图定义,视图的索引将在不带偏见的情况下删除,也不会发出警告。我想知道是否有任何其他已知类似的自动更改索引,如果是这样,我在哪里可以阅读它们?

我的情况:

  • 我在表上有一个唯一的非聚集过滤索引。
  • 索引键列与表的主键相同。
  • 仅包含一个其他列。
  • 今天,当事情进展缓慢时,我意识到过滤器现在已经消失了。
  • 其中一个主键列类型最近更改为其他类型。所以我猜这可能是过滤器拆除发生的时候,但我无法在任何地方找到验证。
  • 如果有帮助,我不能简单地添加过滤器,因为在尝试重新创建时,'新索引定义与现有索引强制执行的约束不匹配。'
  • 我也不能简单地删除索引来重新创建它,因为apparently SQL Server决定使用索引来强制执行外键约束而不是聚簇PK索引。我必须先删除外键约束。

我们所有的开发者都表示他们没有搞乱指数。我们其中一个人可能会健忘。或说谎。或者某人可能已经改变了一些内容而没有仔细阅读警告信息。我不知道这是否是可以自动的,所以我希望你们能告诉我。

谢谢!

1 个答案:

答案 0 :(得分:0)

我猜有人在钓鱼:) 此处的测试代码显示您无法在不首先删除索引的情况下更改PK的列数据类型

create table dbo.worker
(
    id int identity not null constraint PK_worker primary key,
    name varchar(100) not null
);

-- Filtered index based in PK's primary index
create nonclustered index ix_worker
on dbo.worker (id)
where id < 3;

-- Try to change PK's column data type...
alter table dbo.worker
    alter column id bigint;

SQL Server生成以下错误:

  

Msg 5074,Level 16,State 1,

     

第8行索引&#39; ix_worker&#39;取决于列&#39; id&#39;。

     

Msg 5074,Level 16,State 1,Line 8

     

对象&#39; PK_worker&#39;取决于列&#39; id&#39;。

     

Msg 5074,Level 16,State 1,Line 8

     

索引&#39; ix_worker&#39;取决于列&#39; id&#39;。

     

Msg 4922,Level 16,State 9,Line 8

     

ALTER TABLE ALTER COLUMN id失败,因为一个或多个对象访问此列。