我有带有两个数据库的 SQL Server 2017 Standard Editon。
Database1 的当前总索引大小为 111 GB,Database2 的当前总索引大小为 122 GB。
由于我使用的是标准版,因此我只能离线重建索引。我们在磁盘 D: 上拆分了数据库文件,在 E: 上拆分了日志文件。D: 上的可用磁盘空间为 290 GB,E: 上的可用磁盘空间为 35 GB。
如何计算 D: 和 E: 上离线索引重建所需的可用磁盘空间?
对于在线索引重建,我发现一篇 Microsoft 文章指出所需的总空间大约是总索引大小的 1.2 倍。离线重建的估计是否相同?我是否需要这个可用磁盘空间来存储数据库文件和日志文件?
离线索引重建操作创建原始索引的副本,然后删除原始索引,并用副本替换它。
但是,您应该意识到这是每个索引,而不是每个数据库。典型的索引重建解决方案将以串行方式一次重建一个索引;因此您只需要数据驱动器上的可用空间等于最大索引大小的两倍。
由于索引重建是一个记录操作,因此日志驱动器应至少为要重建的最大索引的副本以及可能发生的任何其他并发操作留出足够的空间。您可能会考虑使用
SORT_IN_TEMPDB = ON
进行索引重建操作,因为这允许在 tempdb 中进行大部分索引重建操作 - 如果 tempdb 位于不同的驱动器上,这可能会减少目标数据库日志驱动器上的磁盘空间需求。Microsoft Docs对索引操作的事务日志要求有一些很好的建议。
如果您定期运行索引重建,数据库和日志文件应该已经有足够的未分配空间来运行重建操作,而不需要这些文件在磁盘上增长。当然,这是假设您在每次重建后都没有缩小数据库和日志文件。
如果您在构建索引时使用压缩并且之前没有压缩过,那么您可能不需要 1.2 倍的大小。您可以使用 sp_estimate_data_compression_savings 来估计行或页压缩的索引大小。但是,当使用这些索引时,压缩将需要更多的 CPU。有关压缩的更多信息,请参阅联机帮助。