我有一个大约 10 亿行的表。然后我创建一个索引如下:
CREATE NONCLUSTERED INDEX [IX_Index1]
ON [dbo].[MyTable]( [CustomerID] ASC ) -- CustomerID is uniqueidentifier
WITH (DATA_COMPRESSION=PAGE);
这导致 9.15GB 的索引(压缩),但是在创建索引时事务日志从空变为 158GB(没有其他数据库活动)。为什么使用的日志空间量远高于索引的结果大小?
数据库是可用性组中处于完全恢复模式的 SQLServer 2014 Enterprise。
更新
我删除并使用选项重新创建了索引SORT_IN_TEMPDB = ON
。生成的事务日志写入对于数据库的 tlog 为 10.4GB,对于 tempdb tlog 为 1.27GB。
在此处参考 MS 文档。还在SQLFool 上创建一个 60GB 的索引。
我认为正在发生的事情是,当使用 构建索引时
SORT_IN_TEMDB=OFF
,处理的整个索引构建通过数据库的事务日志记录(数据库设置为完全恢复)。(此外,由于正在编制索引的 GUID 列的散弹枪性质,我预计会有大量的页面拆分)当使用 构建索引时
SORT_IN_TEMPDB=ON
,大多数事务日志活动将针对tempdb
处于SIMPLE
恢复模式的对象。