我记得读取重建索引应该与表size.But生成相同数量的日志文件,我的测试显示otherwise.We需要这个估计,因为我们正在尝试构建蔚蓝数据库索引,并且它有最大2GB的限制。
我的数据库处于完全恢复模式。
从图片中可以看到,用联机索引重建operation.Can生成日志的次数要少得多,如果我遗漏了什么,一定要纠正我。
发布于 2014-12-30 06:48:32
如果要重建聚集索引,则实质上是重新构建表,但非聚集索引只是表的子集(通常)。如果您使用SORT_IN_TEMPDB选项,您将将一些日志记录卸载到tempdb事务日志。版本也很重要,在2005年的联机重建是最少记录的。,但已更改为充分记录在2008年。您可能还想看看这篇文章,它可能有助于决定是重建还是重组,同时考虑日志大小。
-最新消息
使用Shanky的测试设置,我执行了相同的步骤,但我增加了一些额外的大小检查。在重建之前,我执行日志备份,并检查日志空间和利用率以及事务日志中的记录是否为我的索引。然后进行重新构建测试,并重新检查日志大小和日志记录数:
backup log IndexLogging to disk = 'NUL'
--check log space/usage
dbcc sqlperf (logspace)
--check log records for the index, exclude the where for the total number of logs generated
SELECT LogRecordsGenerated = COUNT(*)
FROM sys.fn_dblog(NULL, NULL)
WHERE AllocUnitName = 'dbo.Logging.IX_LOGGING'
--Perform your rebuild operation and then recheck the same parameters
我尝试了大约十几次,每次得到相同的结果,DMV只告诉您事务的情况,但是有几个嵌套的事务是由于log_test事务而产生的,这些事务没有显示,包括区段和页面的分配以及数据的插入。如果您查看日志文件的实际内容,您可以看到脱机重建是如何非常有效的。它只分配页面/区段,格式化它们并设置它们,然后释放旧的页面/区段。在线重建正在做更多的工作,因为它必须在重新构建时保持索引可用。这一点在锁定中可能更明显:离线锁定整个对象,但联机时必须逐页逐页按键执行。你可以看看你自己比较一下:
SELECT
OPERATION,
Context,
[Transaction Name],
[AllocUnitName],
[AllocUnitId],
[Page ID],
Description,
[Lock Information], [Transaction ID]
FROM FN_DBLOG(NULL,NULL)
在索引维护运行期间,可以通过临时切换到BULK_LOGGED来减少日志的生成,但是在这段时间内,您将失去时间点恢复的能力。显然它也是不会减少日志备份。。
-关于DBCC (日志空间)中日志使用情况的更多信息,并选择LogRecordsGenerated =sys.fn_dblog(*) from sys.fn_dblog(NULL,NULL),其中AllocUnitName = 'dbo.Logging.IX_LOGGING‘以显示实际日志大小,注意索引只有648 is
这是在用数据填充日志之后的日志:
数据库名称日志大小(MB)使用的日志空间(%)状态
IndexLogging 14.99219 70.89956 0
LogRecordsGenerated
10903
下面是日志备份后的日志:
数据库名称日志大小(MB)使用的日志空间(%)状态
IndexLogging 14.99219 5.100313 0
LogRecordsGenerated
0
记录一个又一个日志备份,然后联机重新生成:
数据库名称日志大小(MB)使用的日志空间(%)状态
IndexLogging 14.99219 22.642 0
LogRecordsGenerated
11160
记录一个又一个日志备份,然后脱机重新生成:
数据库名称日志大小(MB)使用的日志空间(%)状态
IndexLogging 14.99219 10.79338 0
LogRecordsGenerated
140
https://dba.stackexchange.com/questions/87221
复制