重建索引不释放空间

Kri*_*shn 6 index sql-server maintenance sql-server-2014 index-maintenance

昨天我遇到了一种情况,我的索引被重建,数据库大小增加了一倍(新大小的 50% 未使用)。Sort intempdb设置为 off,我的印象是这种重建导致了它(索引重建不在 中tempdb)。

重建过程是否有理由在完成/潜在故障后保留磁盘空间?

Aar*_*and 11

如果您希望重建使文件系统中的数据文件更小,这不是它的工作方式。

事实上,重建甚至会导致磁盘上的数据文件更大,因为分配了新的页面和范围来保存数据的副本。当旧页面从索引中删除时,它们实际上并没有从任何东西中删除,它们只是被释放了。

你重建你的索引和保存的一些空间的数据文件。这意味着当您添加更多数据(到这个表和其他表)时,数据文件不会立即增长以腾出空间来容纳新数据。

这是一件好事。增长文件是一项昂贵的阻塞操作,您希望将其最小化。暂时缩小文件以取回一些磁盘空间似乎是一个失败的原因。数据文件稍后会再次增长,在这种情况下,您将如何处理您恢复的磁盘空间?将其出租给某人,然后在您的数据库必须再次增长时将其驱逐?只需将其保留为现在的大小,因为除非您将其标记为只读,否则它很可能会再次增长到该大小。

数据文件只是一个容器。放任不管,它只会永远成长。它不会仅仅因为您删除了一些行或重建了一些索引或删除了一个表而收缩。SQL Server 不会释放该磁盘空间并为您缩小文件,同时它不会仅仅因为您删除了碰巧加载到缓冲池中的索引而将内存释放回操作系统:它假设您将再次使用该空间/内存,并且知道不断释放并重新声明它的成本很高。所以它只是坚持它。

而且,几乎在所有情况下,您都会希望这样。如果您真的需要回收一些您知道不会再次使用的空间,请参阅此帖子

  • 我要补充的是,如果重建应用较低的填充因子,它可能会导致额外的增长。 (2认同)