将聚集索引转换为非聚集索引?

5
可以将SQL Server 2005中的聚簇索引转换为非聚簇索引或将非聚簇索引转换为聚簇索引。请将此查询转换为聚簇索引:
create index index1 on mytable(firstcolumn)

请将此查询转换为非聚集索引:
create clustered index clusindex1 on mytable(cluscolumn)
3个回答

6

远非表面看起来那么简单

创建聚集索引

drop index mytable.clusindex1 
go

create clustered index clusindex1 on mytable(cluscolumn)

创建非聚集索引
drop index mytable.clusindex1 
go

create index clusindex1 on mytable(cluscolumn) --non clustered is default

话虽如此,每个表只能有一个聚集索引,因此如果您尝试删除索引并将其重新创建为聚集索引,则如果您已经有聚集索引,则会失败。每当您删除聚集索引时,所有非聚集索引也将被删除并重新创建指向堆,然后在创建聚集索引时再次删除并重新创建,现在指向聚集索引(查找“WITH DROP_EXISTING”子句)

我建议在开始删除和重新创建索引之前,在Books On Line中查找索引工作原理的相关内容。


如果您添加了一个包含所有列的索引(无论是在索引中还是作为包含的列),那么这基本上就相当于第二个聚集索引。 - Andomar
1
如果您的表格超过900字节宽或者有超过16列,那么这种方法就不可行了。 - SQLMenace
据我所知,您最多可以拥有1023个任意宽度的包含列。 - Martin Smith

3

这些不是查询语句,它们是DDL命令。 按需删除并重新创建索引,操作如下:

drop index mytable.index1
go

create nonclustered index index1 on mytable (firstcolumn asc)
go

-1

我也想知道是否可以将聚集索引转换(更改)为非聚集索引。我不认为这是可能的。必须首先删除现有的聚集索引,然后创建新的非聚集索引(可能与聚集索引具有相同的名称)。将非聚集索引转换为聚集索引也是如此。

我不知道您为什么要求将“查询”转换,但@Tahbaza是正确的,您在问题中包含的代码实际上并不是查询。它们是用于更改“数据定义”(即数据库的模式[结构])的T-SQL语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接