作为系统升级的一部分,我们需要能够更新数据库结构以符合最新版本。
我正在为此编写一个工具,但我仍然坚持更新索引中使用的列的正确过程。
如果必须更改索引中的列,哪种方法可能是最不成问题的:
1)禁用索引,更改列,重新启用索引
2)删除索引,更改列,重新创建索引
在许多情况下,必须应用此更改,并且我希望尽可能减少总时间,因此,如果可以避免,我希望不重新创建索引。
答案 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?