我有一个没有索引的 HEAP 表(在 SQL Server 2012 Std 上)。我需要在列上创建聚集索引INT
。大约有 12 亿行,该int
列可以为空且不唯一。我正在努力弄清楚这将在文件组中占用多少空间。有人可以建议吗?
编辑:我会顺便在 tempdb 中排序
我有一个没有索引的 HEAP 表(在 SQL Server 2012 Std 上)。我需要在列上创建聚集索引INT
。大约有 12 亿行,该int
列可以为空且不唯一。我正在努力弄清楚这将在文件组中占用多少空间。有人可以建议吗?
编辑:我会顺便在 tempdb 中排序
当您创建聚集索引时,这会“替换”堆,因此没有额外的索引页(除了 b 树的上层),并且因为您绝对没有其他索引,所以没有其他因素会影响大小的。
因此,如果您的目标列已经存在,我不希望永久占用太多额外空间,除非您
fill factor
设置为非完整的内容(例如,填充因子为 80%,新索引将留下大约 20% 的每片叶子页面备用以供以后添加)。当堆重建为聚簇索引时,可能会使用一些额外的空间,因此您的数据库可能需要增长以适应这一点,但是一旦该过程完成,任何此类额外空间都将免费供将来分配。
有关示例,请参阅产品文档中的索引磁盘空间示例。
在 SQL Server 2005 技术文章中的联机索引操作中有更详细的信息(尽管名称如此,它也涵盖了脱机操作)。
额外的
正如您所注意到的,它可能比以前占用更少的空间。由于随着时间的推移进行删除和更新,您可能有很多部分使用或空白的页面。除非在删除时指定,否则堆不会释放由删除创建的空页所使用的空间
TABLOCK
,即使如此也不总是如此。来自DELETE
(事务处理 SQL):前向记录指针(聚集索引中不存在)也可能使用了少量空间,并且如果您的行是可变长度的页面空间块,这些空间太小而无法用于新行。您新近重组的行将更加紧凑(填充因子设置允许),因此可能会使用更少的页面。
如MSDN中所述:
您可以使用以下步骤来估计在聚簇索引中存储数据所需的空间量:
此外,您可以参考这篇文章SQL Server 中的堆:性能、维护和您的理智,它有助于如何识别堆、如何测量它们的大小以及如何计划将堆转换为聚簇索引的更改。