昨天我遇到了一种情况,我的索引被重建,数据库的大小翻了一番(50 %的新大小未使用)。tempdb中的排序设置为off,我的印象是这种重建导致了它(索引重建,而不是tempdb中的索引重建)。
重建过程是否有理由在完成/潜在故障后保留磁盘空间?
发布于 2018-04-06 11:45:49
如果您期望重新生成可以使文件系统中的数据文件更小,则它不是这样工作的。
事实上,重建甚至会导致磁盘上的更大的数据文件,因为分配了新的页和区段来保存数据的副本。当旧页从索引中删除时,它们实际上不会从任何内容中被删除,它们只是被取消分配。
您已经重建了索引,并在数据文件中节省了一些空间。这意味着当您添加更多的数据(到这个表和其他表中)时,数据文件不需要立即增长来为新数据腾出空间。
这是件好事。生成文件是一种昂贵的阻塞操作,您希望将此最小化。缩小文件以获得一些暂时的磁盘空间似乎是一个失败的原因。数据文件将在稍后再次增长,在这种情况下,您将如何处理您返回一段时间的磁盘空间?把它租给某个人,然后在你的数据库再次增长的时候将他们驱逐出去?让它保持到现在的大小,因为除非你把它标记为只读,否则它很可能会再次增长到这个大小。
数据文件只是一个容器。独自一人,它只会成长。它不会因为您删除了一些行或重建了一些索引或删除了一个表而收缩。SQL Server不会为您释放磁盘空间,同时也不会将内存释放回操作系统,仅仅因为您删除了一个碰巧被加载到缓冲池中的索引:它假设您将再次使用该空间/内存,并且知道继续释放它和重新声明它是很昂贵的。所以它只会抓住它。
而且,在几乎所有的情况下,你都会想要这样的。如果您确实需要回收一些您知道不会再次使用的空间,请参阅这个职位。
发布于 2018-04-06 17:47:45
如果你能负担得起离线重建,那么它就不会占用那么多的空间。即使开着sort_in_tempdb,结果至少也需要2倍的空间。联机重建需要在重建新副本的同时维护原始索引,然后在结束时使用更短的锁存器来替换它并应用临时更改。脱机重建将删除索引并重新创建它,但同时它将导致表上的阻塞。
https://dba.stackexchange.com/questions/203228
复制相似问题