使用依赖索引更改表

时间:2016-01-23 13:17:48

标签: sql-server

作为系统升级的一部分,我们需要能够更新数据库结构以符合最新版本。

我正在为此编写一个工具,但我仍然坚持更新索引中使用的列的正确过程。

如果必须更改索引中的列,哪种方法可能是最不成问题的:

1)禁用索引,更改列,重新启用索引

2)删除索引,更改列,重新创建索引

在许多情况下,必须应用此更改,并且我希望尽可能减少总时间,因此,如果可以避免,我希望不重新创建索引。

1 个答案:

答案 0 :(得分:1)

我做了一些测试,看来你无法改变索引列。

test data:
create table idd
(
id int identity(1,1),
name char(33),
name2 varchar(40) null
)

create unique clustered index nci_id on idd(id)
create index nci_test1 on idd(name2)

--disable index
alter index nci_test1 on idd disable

--alter column
alter table idd
alter column test1 varchar(100) not null

below is the error:
Msg 5074, Level 16, State 1, Line 36
The index 'nci_test1' is dependent on column 'test1'.
Msg 4922, Level 16, State 9, Line 36
ALTER TABLE ALTER COLUMN test1 failed because one or more objects access this column.

这是显而易见的,因为我有聚簇密钥。如果我删除聚簇密钥然后在非聚集索引键列上执行alter操作会发生什么情况,结果是相同的。我们只能在删除它们之后更改索引列

drop index  [nci_id] on idd

--alter column
alter table idd
alter column test1 varchar(100) not null 

我想你对影响有什么了解

1.我们必须首先丢弃聚簇密钥..重写tlog写道,因为非聚簇密钥也必须改变指针
2.我们必须重建索引

你只能放弃它们。我建议你继续使用这种方法(因为你必须丢弃聚集索引的方式)

1.Drop index
2.更改列数据类型
3.recreate index

进一步尝试将数据库恢复模式更改为简单,以便在此操作之前最小化TLOG写入,并添加nocheck选项.Bellow问题有一些有用的答案可能对您有所帮助

https://dba.stackexchange.com/questions/48872/quickly-change-null-column-to-not-null

How do you add a NOT NULL Column to a large table in SQL Server?