如何为你的数据库事务日志减肥?

在大多数SQL Server的工作环境中,尤其是在OLTP环境中,数据库的事务日志性能出现瓶颈时往往会导致事务完成需要更多的时间,此时许多人把原因都归结于I/O子系统,理由是它不能够支撑工作负载产生的的大量的事务日志,然而实际情况却都未必如此。

事务日志写等待时间

对 于事务日志来讲,写操作等待的时间可以使用sys.dm_id_virtual_file_stats和系统中的事件writelog等待进行监视。如果 写等待时间比你期望的I/O子系统较高,那麽I/O子系统就不能够支撑,这是一般的假设,但不意味着需要升级你的I/O子系统。

在许多系统你是你会发现有相当比例的多余的日志记录的产生,如果能够减少这些不需要的日志记录,相应的也就减少了写入磁盘的事务日志的数量,也相应的转化为写等待时间的减少,因此也就减少了事务完成的时间。

引起多余日志记录的产生有两个主要的原因:

未被使用的nonclustered indexes

索引碎片的增多

未被使用的索引

无 论在任何时候向表中插入记录时,同时也会在该表上定义的每一个noncluster index插入一条记录(注意,filetered index有可能会例外 ),这就意味着多余的日志记录的产生;在表中删除记录也是同样的,在noncluster index相应的记录也必须被删除,而更新数据也会同样的对noncluster index中的记录进行修改。要保持每一个noncluster index和相关的表之间的正确关系(真实反映),这些操作是必要的,但是如果noncluster index在查询计划中未必使用,但为维护他们所产生的操作和日志记录也会是多余的费用,随着noncluster index碎片的增长,就需要定期的对他们进行维护,维护同样也会产生更多的日志记录也是完全不需要的。

未被 使用的索引有可能是你错误的在表上创建了一个索引,或者是按照SQL Server的丢失索引的DMV的建议创建的,或者是按照数据库的优化顾问创建的,也有可能是业务的改变导致原先使用的索引不再被使用。

无论如何,这些未被使用的索引都应该被清除以便减少负荷,首先要确定哪些索引是未被使用过的,可以通过sys.dm_db_index_usage_stats这个DMV来查看。

索引碎片

在许多人看来,索引碎片会导致要求读取更多的数据页,实际上索引碎片也会导致多余日志记录的产生而原因就在于产生碎片的原因。

碎片是由于页拆分page split这种现象的发生而导致的,简单的解释就是当插入记录而空间不足导致了页拆分,这种过程是这样子的:

一个新的索引被分配和格式化

从装满数据的页中移出一半的记录到新页

新页链接到索引结构中

新的记录被插入到页面中

这些所有的操作都会产生日志记录,你可以想象的到,要远比你插入一条记录所产生的日志记录要多。

减 少额外耗费的第一步就是清除未被使用的索引,目的就是杜绝其再产生页拆分,所以要找出那些被分割成碎片的索引,第二步决定使用哪种碎片整理方法的是分析索 引以确定碎片程度。通过使用系统函数 sys.dm_db_index_physical_stats,您可以检测特定索引、表或索引视图的所有索引、数据库中所有索引或所有数据库中所有索引 中的碎片。对于已分区索引,sys.dm_db_index_physical_stats 还提供每个分区的碎片信息。SQL Server 2005 中计算碎片的算法比 SQL Server 2000 中的算法更精确。因此,碎片值显得更高。例如,在 SQL Server 2000 中,如果某表的页 11 和页 13 在同一区,而页 12 不在该区,则不会将该表视为碎片。但若要访问这两页,却需要两个物理 I/O 操作,因此在 SQL Server 2005 中,此表被计为碎片。使用索引填充因子重建或重新组织索引,以便在索引中保留部分空的空间为后续插入的记录使用,这样就减少了页拆分现象的发生,因而也就 减少了额外的日志记录的产生。(请参考另一篇文章:发现那些未被使用的数据库索引)

当 然,天下没有免费的午餐,任何对一方有利的东西对另一方可能就会有害。当使用填充因子fillfactors时会降低页面密度,过低的页面密度同样也会带 来一些性能问题,当然过高会带来页拆分,所以这是一个需要权衡的问题,具体要参考你的环境,比如说是OLTP还是OLAP等。

总结

减少事务日志的写等待时间不总是要升级你的I/O子系统,在数据库中使用简单的索引分析,就能显著的减少大量的事务日志记录的产生,也就同样的减少写等待时间。

当然,这仅仅是影响事务日志性能的一个方面,只有对事务日志的机制有更深入的了解,你才会发现,和事务日志性能方面的问题的更多方面。

关于作者

姜传华,长期从事数据库的教学、设计、开发和应用管理工作,有着20年以上的IT工作经历,深刻理解关系数据库原理及SQL Server体系架构。同时也活跃于Microsoft的各大论坛网站。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

原文地址:https://www.cnblogs.com/syncnavigator/p/10198398.html

时间: 2024-10-09 22:21:33

如何为你的数据库事务日志减肥?的相关文章

(转)对SQLSERVER数据库事务日志的疑问

本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLSERVER了 实验环境:SQLSERVER2005 SP4,Windows7 本来没什么心情写文章,反正没人看,关于我文章中提到的问题,有些可以从文章结尾的MSDN补充那里找到答案,而有些还没有答案 根据CSDN博客的这篇文章介绍,大家可以先看一下,然后再继续往下看,因为下面会引用到CSDN博客里的

配置了AlwaysOn的数据库事务日志收缩

由于配置了AlwaysOn的数据库为完整恢复模式,使得数据库的事务日志增长飞快,导致报错“事务日志已满”. 解决方法: 1 完整备份事务日志,选中截断事务日志选项* 2 收缩数据库事务日志文件* 3 完整备份数据库 4 再次备份事务日志,同选中截断事务日志选项 5 再次收缩数据库事务日志文件 步骤1与2是否可省略待验证.

SQL Server数据库事务日志序列号(LSN)介绍

原文:http://blog.csdn.net/tjvictor/article/details/5251463 ? ? 日志序列编号(LSN)是事务日志里面每条记录的编号. 当你执行一次备份时,一些LSN值就被同时存储在文件本身及msdb..backupset表中.你可以使用RESTORE HEADERONLY语法来从备份文件中获取LSN值. ? 注意:在SQL Server 2000中,有一列叫做DifferentialBaseLSN.但在SQL Server 2005中,相同的列名称变成了

SQL Server数据库事务日志存储序列

原文 原文:http://blog.csdn.net/tjvictor/article/details/5251351 ? 如果你的数据库运行在完整或是批量日志恢复模式下,那么你就需要使用作业(job)来定期备份事务日志,保持你的事务文件大小处在一个可管理的范围.当你需要还原事务日志时,你就需要按照创建事务日志的顺序来恢复它们.你可以参考存在msdb..backupset表中的信息来确定还原文件的顺序,使用FirstLSN和LastLSN列的值作参考.当你备份时,这些备份信息就会存在backup

mssql 2000数据库事务日志清除

重点注意:在操作前一定要备份数据库-完整备份. 在进行操作前最好是先去查看下相关文章,在测试环境下测试,确定熟悉了之后 才在线上服务器进行操作(有个原则:新部署的一些应用,或者一些脚本,一定要在测试环境上先测试后才能拿到线上服务器应用或操作). 打开查询分析器: 1.执行: select fileid,groupid,name from sysfiles where groupid=0  //获取fileid,假设为2 2.执行: backup log winiis with no_log; d

(转)解释一下SQLSERVER事务日志记录

本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log explorer 那么事务日志记录怎麽查看,里面都记录了些什么? 打开可以利用下面SQL语句来查看所在数据库的事务日志记录 1 USE [GPOSDB] -

SQL Server中的事务日志管理(9/9):监控事务日志

当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会告诉你每个DBA应该知道的具体细节. 对于在我们关注下的所有数据库,在日志维护方面,我们的首要目标是最优化写性能,为了支持SQL Server写入日志的所有活动,包括数据修改,数据读取,索引维护等等.但是,留意下可能的日志碎片也是重要的,如前面文章介绍的,它会影响需要读取日志的过程性能,例如日志备份

如何截断SQL Server2008+事务日志空间

SQL数据库事务日志记录数据库的任何更改,用户可回滚事务日志来恢复数据,但随着数据库使用时间变长,日志文件也会变得很大. 若要避免数据库的事务日志被填满,例行备份至关重要.做了日志备份后,会释放不活跃的VLF,增加日志的可用空间.但默认情况下备份日志,其日志文件的大小并未变化,如下图 备份前,总大小24.13MB 备份后,总大小仍然为24.13MB,但已用空间占比从93.1%降至11.0% 也就是,已使用日志空间是减小了,但未使用日志空间并未释放.其实,如果磁盘空间足够的话,可以不用收缩空间 那

XenDesktop 5 SQL Server Mirror事务日志比较大的原因分析

在实施XenDesktop5项目过程中,发现XenDesktop5版本的数据库镜像事务日志很大,在XenDesktop4和XenApp版本中不存在该问题:于是我根据该现象探究XenDesktop5及以上版本镜像数据库事务日志为何如此之大以及我们今后实施的过程中该如何来维护这么庞大的数据库事务日志. 在XenDesktop解决方案中,对数据的处理是由专门的数据库来进行数据存储处理的,而对于数据库的高可用,有3种方式: SQL Mirror Virtual Machine HA(VMware FT)