将生成多少日志索引重建。我记得阅读重建索引应该生成与表大小相同数量的日志文件。但我的测试显示并非如此。我们需要这个估计,因为我们正在尝试构建 azure 数据库索引并且它有一个限制最大 2 GB。
我的数据库处于完全恢复模式。
表大小:
日志大小:
从图片中您可以看到在线索引重建操作的日志生成非常少。如果我遗漏任何内容,有人可以纠正我吗
将生成多少日志索引重建。我记得阅读重建索引应该生成与表大小相同数量的日志文件。但我的测试显示并非如此。我们需要这个估计,因为我们正在尝试构建 azure 数据库索引并且它有一个限制最大 2 GB。
我的数据库处于完全恢复模式。
表大小:
日志大小:
从图片中您可以看到在线索引重建操作的日志生成非常少。如果我遗漏任何内容,有人可以纠正我吗
如果您正在重建聚集索引,则实质上是在重建表,但非聚集索引只是表的子集(通常)。如果您使用 SORT_IN_TEMPDB 选项,您将卸载一些日志记录到tempdb 事务日志。版本也很重要,在 2005 年,联机重建的日志记录最少,但在 2008 年又改回完全记录。您可能还想看看这篇文章,这可能有助于决定是否重建或重新组织考虑日志大小.
- - 更新 - -
使用 Shanky 的测试设置,我执行了相同的步骤,但我添加了一些额外的尺寸检查。在重建之前,我会执行日志备份并检查日志空间和利用率以及我的索引的事务日志中的记录。然后我进行重建测试并重新检查日志大小和日志记录数:
我尝试了十多次,每次得到相同的结果时,DMV 只告诉你事务,但是有几个嵌套事务是由于 log_test 事务而产生的,这些事务没有显示,包括范围和页面的分配以及数据的插入。如果您查看日志文件的实际内容,您会发现离线重建非常高效。它只是分配页面/范围,格式化它们并设置它们,然后释放旧的。在线重建需要做更多的工作,因为它必须在重建时保持索引可用。这在锁定中可能更明显:离线它锁定整个对象,但在线它必须逐页逐个键。你可以自己看看比较:
您可以在索引维护运行时通过临时切换到 BULK_LOGGED 来减少生成的日志,但您将无法在该时间段内进行时间点恢复。显然它也不会减少您的日志备份。
--更多关于从 DBCC SQLPERF (logspace) 和 SELECT LogRecordsGenerated = COUNT(*) FROM sys.fn_dblog(NULL, NULL) WHERE AllocUnitName = 'dbo.Logging.IX_LOGGING' 来显示实际日志大小的信息,注意索引是只有 648KB
这是用数据填充后的日志:
数据库名称 日志大小 (MB) 已用日志空间 (%) 状态
索引记录 14.99219 70.89956 0
生成的日志记录
10903
这是日志备份后的日志:
数据库名称 日志大小 (MB) 已用日志空间 (%) 状态
索引记录 14.99219 5.100313 0
生成的日志记录
0
日志备份后登录,然后在线重建:
数据库名称 日志大小 (MB) 已用日志空间 (%) 状态
索引记录 14.99219 22.642 0
生成的日志记录
11160
日志备份后登录,然后离线重建:
数据库名称 日志大小 (MB) 已用日志空间 (%) 状态
索引记录 14.99219 10.79338 0
生成的日志记录
140