当SQL Server会话等待WRITELOG等待类型时,它将等待将日志缓存的内容写入存储事务日志的磁盘。
为了更详细地说明该过程,假定会话启动一个事务,该事务将执行多个INSERT语句。插入数据时,将发生两个操作:
此过程将继续进行,直到事务完成(提交)为止,此时日志缓存中的数据立即被写入物理日志文件。当SQL Server将日志缓存刷新到磁盘时,会话将以WRITELOG等待类型等待。
获取更多信息
如果会话始终在WRITELOG等待类型上等待,请查看以下Perfmon数据以获取存储事务日志的磁盘瓶颈迹象:
使用SolarWinds Database Performance Analyzer或其他工具,还可以确定等待WRITELOG事件的顶部SQL语句。如果发现许多语句正在等待,则可能表明上述问题之一是问题所在。如果仅发现一些等待WRITELOG的SQL语句,则可能表明事务使用效率低下(在下面的示例中进行讨论)。
WRITELOG等待类型:解决问题
磁盘子系统性能 –在有关WRITELOG等待类型的许多文档中,该问题似乎常常被误解为磁盘子系统问题。在出现磁盘问题的情况下,Perfmon中的PhysicalDisk对象的计数器将很高,并且修复程序通常包括:
频繁提交数据–在性能咨询期间,在很多情况下,过度热心使用事务可能会导致对WRITELOG等待类型的过多等待,即过于频繁地提交数据。为了说明此问题,请考虑以下代码示例:
示例1:以下代码执行了418秒,并在WRITELOG等待类型上等待了410秒。请注意,COMMIT语句如何位于循环内部并执行了100,000次。
DECLARE @i INT SET @i = 1 WHILE @i < 100000 BEGIN BEGIN TRANSACTION INSERT INTO [splendidCRM].[dbo].[product] ([productid], [category], [name], [descn]) VALUES (@i, floor(@i / 1000), ‘PROD‘ + REPLACE(str(@i),‘ ‘,‘‘), ‘PROD‘ + REPLACE(str(@i),‘ ‘,‘‘)) SET @i = @i + 1 COMMIT END
示例2:以下代码(如上所述也插入了100,000行)耗时3秒,并且在WRITELOG等待类型上等待的时间少于一秒。请注意,COMMIT语句如何位于循环外部,并且仅执行一次。
DECLARE @i INT SET @i = 1 BEGIN TRANSACTION WHILE @i < 100000 BEGIN INSERT INTO [splendidCRM].[dbo].[product] ([productid], [category], [name], [descn]) VALUES (@i, floor(@i / 1000), ‘PROD‘ + REPLACE(str(@i),‘ ‘,‘‘), ‘PROD‘ + REPLACE(str(@i),‘ ‘,‘‘)) SET @i = @i + 1 END COMMIT
最后的想法
当发现会话正在等待WRITELOG等待类型时,必须对情况进行全面分析,包括检查磁盘性能数据以及查看所有在WRITELOG上找到的查询语句。只有这样,您才能放心,您正在解决正确的问题,而不仅仅是添加无法解决根本原因的昂贵硬件。
【2】解决思路参考
有时系统卡住,因此首先尝试清除等待状态
1. Dbcc Sqlperf(sys.dm_os_wait_stats,clear)
2.分离数据库数据文件和日志文件是单独的驱动器。
3.如果日志文件大小太大,则限制其大小并插入另一个LDF。
4.如果平均磁盘队列长度大于1,则它将导致磁盘瓶颈。还需要检查DISK突袭等级。
5.设置恢复模式为简单模式
【3】查看参考
SQL Server联机丛书将等待类型WRITELOG定义为“在等待日志刷新完成时发生。导致日志刷新的常见操作是检查点和事务提交。“
检查点将当前在缓冲区中的所有SQL脏页写入磁盘。事务提交使数据修改在数据库中永久存在。
注意事项:
1)最高优先级–检查磁盘io susbsystem性能。
2)sys.dm_io_virtual_file_stats DMV通过返回有关数据库文件的IO统计信息来帮助识别性能下降。
sys.dm_io_virtual_file_stats上的io_stall很好地指示了IO问题。没有确定的数字,但是越低越好。
根据相关工作负载对某些系统进行基准测试,并作为指导。
3)如果事务日志与数据共享相同的驱动器,则将其分离到映射到不同IO通道的不同驱动器\上。
4)相对于工作负载,不仅是缓慢的IO子系统,而且可能是导致IO子系统过度工作的原因
Resolving SQL Server Transaction Log Waits
https://logicalread.com/2012/11/08/sql-server-writelog-wait-dr01/#.XmX1AFIzaUk
原文:https://www.cnblogs.com/gered/p/12449594.html