我有一个未压缩的聚集主键。它在聚集索引的主要部分中消耗了 63.6 GB,其中 LOB 为 17.9 GB。该表的唯一非聚集索引为 57.3 GB,其中 LOB 也为 17.9 GB。我希望在数据库不增长的情况下离线重建聚集索引。sp_spaceused
不带参数运行会在其“未分配空间”列中报告 66 GB。
我想要做的事情可以实现吗?或者重建压缩索引是否会强制重建非聚集索引,从而占用至少 100 GB?
尽管我尽了最大努力,但我在文档或 Stack Overflow 中都没有找到答案。我对手边的一个小型数据库进行的实验表明,重建聚集索引不会强制重建非聚集索引。
没有
重建聚集索引不会重建非聚集索引,除非您更改聚集索引键列。
如果要向堆表添加聚集索引或删除聚集索引,您还需要重建非聚集索引,以根据场景交换非聚集索引中的键/RID。
聚集索引和非聚集索引是两个独立的对象,但在 SQL Server 中,它们是相关的。非聚集索引继承了聚集索引键列,以便于查找等。这就是为什么某些聚集索引更改也需要重建非聚集索引的原因。
如果您想在不增加用户数据库容量的情况下执行此操作,则在索引重建命令中添加SORT_IN_TEMPDB选项可能会有所帮助。这样,您只需要担心将在其上创建索引的文件组是否有空间容纳新索引,而不是新索引加上中间排序。这可能会增加 tempdb,具体取决于其当前配置。
如果这是个问题,您可以随后重新启动 SQL Server,将 tempdb 重新设置为其默认文件大小。由于您能够离线重建约 66GB 的聚集索引,因此我假设这不是高度敏感的 24x7 工作负载,或者这是一个非必要的表。