索引创建导致大量事务日志增长

geo*_*tnz 6 index sql-server transaction-log sql-server-2014

我有一个大约 10 亿行的表。然后我创建一个索引如下:

CREATE NONCLUSTERED INDEX [IX_Index1] 
ON [dbo].[MyTable]( [CustomerID] ASC )  -- CustomerID is uniqueidentifier
WITH (DATA_COMPRESSION=PAGE);
Run Code Online (Sandbox Code Playgroud)

这会产生 9.15GB 的索引(压缩),但是在创建索引时事务日志从空变为 158GB(没有其他数据库活动)。为什么使用的日志空间量远高于索引的结果大小?

数据库是可用性组中处于完全恢复模式的 SQLServer 2014 Enterprise。

更新 我删除并使用选项重新创建了索引SORT_IN_TEMPDB = ON。DB tlog 的事务日志写入结果为 10.4GB,tempdb tlog 为 1.27GB。

geo*_*tnz 5

请参阅此处的MS 文档。还在SQLFool 上创建 60GB 索引

我相信正在发生的事情是,当使用 构建索引时SORT_IN_TEMDB=OFF,处理的整个索引构建都会通过数据库的事务日志记录(数据库设置为完全恢复)。(此外,由于正在索引的 GUID 列的分散性,我预计会有大量页面拆分)

当使用 构建索引时SORT_IN_TEMPDB=ON,大多数事务日志活动将针对tempdb处于SIMPLE恢复模式的情况。