在SQL Server中,如果我想向集群索引定义添加一个新列,则无法更改集群索引。唯一的选择是使用新定义删除和创建集群索引。
根据我的理解,删除和创建集群索引对于高容量表来说是非常昂贵且耗时的。
群集索引重新创建会重建表上的所有非聚簇索引,这可能非常昂贵。
这个论坛的问题"无论如何我们可以加快群集索引的重建速度"
我能想到的一个解决方法是在重新创建集群索引之前删除所有非集群索引。这种方法会起作用吗?
答案 0 :(得分:4)
使用
CREATE .... WITH (DROP_EXISTING = ON)
而不是
DROP ...
CREATE ...
这意味着非聚簇索引只需更新一次(包括新的键列)。不是两次 - 首先使用物理摆脱然后再使用新的CI密钥。
DROP_EXISTING子句告诉SQL Server现有的聚簇索引正在被删除,但是会在其位置添加一个新的聚合索引,让SQL Server推迟更新非聚簇索引,直到新的聚簇索引到位。
此外,如果聚簇索引键没有更改并且定义为UNIQUE,则SQL Server根本不会重建非聚簇索引,这不是定义聚簇索引的明显性能优势如UNIQUE
实施例
CREATE TABLE #T
(
A INT,
B INT,
C INT
)
CREATE CLUSTERED INDEX IX ON #T(A)
CREATE CLUSTERED INDEX IX ON #T(A,B) WITH (DROP_EXISTING = ON)
DROP TABLE #T