Tsql MS-SQL:重建与重建的空间开销

Tsql MS-SQL:重建与重建的空间开销,tsql,indexing,rebuild,defragmentation,Tsql,Indexing,Rebuild,Defragmentation,我们需要每年从一个巨大的表中删除一次旧数据。表的行非常紧凑(大约40字节),表上只有一个聚集索引 数据库总共约为750GB,处理的表大小为640GB,在清理之前包含87亿行。删除后,只剩下37亿行,数据大小降至约500 GB 这些数字看起来很奇怪,但很好:每页都删除了一些行。有些页面被清空和删除,有些页面没有更改,仍然100%满,但现在大部分页面都已部分填满,每个页面上都有大量无人认领的空间 要回收这个空间,我需要重建索引。我的问题是:如何在一个与索引本身大小差不多的数据库中对索引进行碎片整理

我们需要每年从一个巨大的表中删除一次旧数据。表的行非常紧凑(大约40字节),表上只有一个聚集索引

数据库总共约为750GB,处理的表大小为640GB,在清理之前包含87亿行。删除后,只剩下37亿行,数据大小降至约500 GB

这些数字看起来很奇怪,但很好:每页都删除了一些行。有些页面被清空和删除,有些页面没有更改,仍然100%满,但现在大部分页面都已部分填满,每个页面上都有大量无人认领的空间

要回收这个空间,我需要重建索引。我的问题是:如何在一个与索引本身大小差不多的数据库中对索引进行碎片整理

如果我没记错的话,索引碎片整理重建将需要1.3倍于其工作大小的可用空间,因为它以排序方式复制数据。数据库将增长近1 TB,一旦碎片整理完成,就不再需要这个新空间

碎片整理后收缩没有帮助,因为它引入了新的(严重的)碎片

我知道“SORT_IN_TEMPDB”设置。是否有此设置所需DB中的估计可用空间

作为替代方案,我可以删除并重新创建聚集索引,但我不确定该操作需要多少空间

重新组织索引不会回收每个页面上的空间(?),因此此操作也不是我想要的

谢谢你的建议! 拉尔夫

我们需要每年从一个巨大的表中删除一次旧数据


这正是分区的用例。每年分区,删除子表,完成。停工期毫秒,如果你做得聪明。

谢谢-但是。。。我遗漏了一些关键信息,这使得本例中的分区很困难。该数据库是一个时间序列存储,但已完全版本化。这意味着,每个数据点都有2个时间戳:一个是该值所在的日期,另一个是该值是该天已知的最新值的起始日期范围。清理意味着删除不再在范围内的数据(业务)和删除数据历史记录(纯技术)。您的集群密钥需要考虑“旧”数据的两个方面。问题是:重建和重新创建的空间开销。答案中完全没有关于重建/重组操作的空间要求的信息。