事务日志VLF对性能有多重要?


12

考虑数据库性能时,VLF有多重要?什么将描述VLF的最佳情况?


如要进一步了解,请参阅我的问题dba.stackexchange.com/questions/25408/...
最大弗农

很酷-我认为这对报告性能很有帮助
the_good_pony 2013年

1
@DBAWaffle参见:Glenn Berry的SQL Server VLF实验,第1部分 -> sqlskills.com/blogs/glenn/…–
Kin Shah

Answers:


17

什么是虚拟日志文件?

SQL Server将每个数据库的事务日志文件分成较小的块,称为“虚拟日志文件”(简称VLF)。它们的主要功能是在日志备份中用作截断标记,即SQL Server仅清除(并且标记为可重复使用)完全为空的VLF。MSDN上有一篇关于事务日志的物理体系结构的文章

什么决定了VLF的数量?

每次日志文件增长时(无论是通过自动增长还是通过手动增长),日志文件的新部分都将完全基于新部分的大小而划分为多个VLF(现有事务日志将单独保留)。因此,小的自动增长设置(即默认值为10%自动增长)将导致创建大量的VLF。

大量VLF的含义是什么?

大量VLF引起的主要问题是:

  • 恢复速度慢(恢复是数据库还原期间的一个阶段,在该阶段中,已完成的事务被写入数据页,而未完成的事务被回滚)。
  • 数据库镜像设置中的日志读取器性能降低。
  • 创建数据库快照时的性能降低(请注意,这还包括某些功能,DBCC因为它们在后台使用数据库快照来促进一致性检查而不会阻塞)。

我如何找出我的数据库有多少个VLF?

DBCC LOGINFO将为数据库的事务日志中的每个VLF返回1行。这个问题有几个有用的脚本,可以将其应用到服务器上的所有数据库中。

多少个VLF太多?

这是一个判断电话,您必须自己动手做。我个人的经验法则是,不足50岁的人是不值得的,超过100岁的人(大约),我修复了自动增长设置,并记下了(在下一个维护窗口中)缩小和重新生成日志的记录(如下所示) 。

救命!我有110亿个VLF,数据库恢复需要整天!

简短概述(摘自Kimberly Tripp的博客):

  • 确保您是数据库中唯一活动的连接(因此,在维护窗口期间执行此操作)
  • 将事务日志备份到磁盘(使用BACKUP LOG
  • 运行DBCC SHRINKFILETRUNCATEONLY收缩日志文件,以可能的最小尺寸。
  • ALTER DATABASE [...] MODIFY FILE [...] SIZE=newsize只需一步即可运行以重新设置事务日志的大小**。

**注意-如果您的日志文件非常大(数十GB或更多),则可能需要分多个步骤调整大小,以获取具有适当大小的适当数量的VLF,以避免过多的“笨拙”日志备份。由于VLF是截断的单位,因此它们还可以确定日志备份的大小,如Kim的博客所述


谢谢,您是否认为多个VLF在更高的OLTP环境中会更明显地阻碍性能,在OLTP环境中,数据需要定期更改,需要进行大量提交?
the_good_pony

大量的VLF仅在我上面概述的情况(恢复,快照,镜像)中才真正值得注意。它们可能会在OLTP环境中稍微影响性能,但仅会在一定程度上影响性能。
Simon Righarts 2013年

1
对我来说,恢复20个小时以上使我深信保持低(低于1,000)VLF计数的重要性。
Max Vernon

@SimonRigharts我很好奇。大量的VLF是否会完全影响常规交易性能?还是只影响备份和还原?
克里斯·阿尔德里奇

@ChrisAldrich 如果事务跨越VLF边界(但是我还没有听说过),则事务可能会有少量的开销,但是正如问题中所详述的那样,只有您真正注意到在恢复,镜像或快照期间有大量VLF。
Simon Righarts '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.