日志表设计优化与实现

摘要

这篇文章从日志表问题引入、日志表的共有特性、日志表的设计需求、设计思路以及设计详细实现的角度,阐述了在SQL Server数据库中如何最优化设计日志表来降低系统资源的占用和提高系统吞吐量。

问题引入

在平时与客户服务与交流过程中,我们不止一次的被客人问及这样的场景:我们现在面临如何设计SQL Server日志表方案,如何最优化设计数据库日志记录表。因为,日志表设计会面对如下问题:

表记录数大:日志表由于记录了应用程序的很多操作日志,有的业务有很多步骤,甚至每个步骤操作都会被记录到日志表中,所以通常日志记录表都很大,表记录数据很多,表空间占用很大。

事务操作频繁:由于日志记录表写入(INSERT)操作非常频繁,加之表变得很大,通常的做法是会删除过期的日志信息(DELETE),所以事务操作非常频繁。

占用了昂贵的IOPS资源:日志表原本写入操作就非常频繁了,加之需要删除过时数据操作,这一写一删操作,使得事务量加倍,导致了数据库系统IOPS资源的过度被日志表的操作所占用了。

吞吐量上不去:日志表事务操作频繁,如果删除操作的事务没有控制好(比如:我见过很多客人一个DELETE语句下去删掉几十、几百万记录数的操作),很有可能会导致锁等待的发生(Blocking),从而影响应用的吞吐量和并发能能力。

日志表设计面临的这一系列问题给我们设计带来了不小的挑战,而我们今天这篇文章就是要解决日志表设计面临的这些问题。这篇文章将会分享SQL Server日志表设计的优化方案以及方案的实现细节,聪明的你甚至可以将这个设计方案推广到其他的关系型数据库。

日志表特性

首先,在分享设计方案之前,我们来看看关系型数据中的日志表,具有哪些共同的特性:

事务特性

日志表最为明显的特性是事务特性,或者称之为最重要的特性也不为过,即:写多读少,再准确一点说,是INSERT或者DELETE操作多;SELECT或者UPDATE操作少,这个很好理解。

INSERT操作:INSERT操作是记录日志信息,当然是非常频繁且是少不了的,几乎是每时每刻都在发生。对系统吞吐量和并发要求高。

UPDATE操作:日志表中记录一旦写入,几乎不会被修改,所以UPDATE操作应该非常少,更或者没有。

SELECT操作:SELECT操作也不会太频繁,只会在排查问题,查询日志的时候使用,所以,概率也比较小。

DELETE操作:而为了保证表记录数尽可能的少和查询操作(SELECT)的高效性,我们往往会定时清理过时的日志记录,所以DELETE操作相对还是很频繁的,和INSERT操作的频繁度是对等的。当然这里是可以通过设计来优化的,这也恰恰是这篇文章的中心思想。

设计特性

由于日志表的事务特性,所以,我们对日志表结构的设计就十分考究,比如:

主键设计:日志表因为几乎不会被UPDATE,数据都是追加写入,因此,主键最好选择是INT或者BIGINT数据类型的自增列(IDENTITY属性列),且做为CLUSTERED升序排列索引,即表按照主键列物理升序排列。这样设计的好处是,日志记录追加写入数据时,表不会被部分(或全部)重新排序,且几乎不会产生碎片。举一个反例,如果表主键列为UNIQUEIDENTIFIER数据类型,且值通常为默认值NEWID,那么当新追加的记录主键值小于之前的记录主键值时,会导致这一页的数据重排序,而且容易产生索引碎片。

索引设计适可而止:基于日志表事务特性的分析,我们很少在日志表上进行SELECT查询操作,所以,索引不宜过多,适可而止。理由是:索引过多,影响日志表INSERT操作的性能,因为,系统需要额外维护索引结构中数据和基表数据的一致性。按照我们的经验,通常,我们只需要在时间字段上建立索引即可,然后通过时间来过滤查询结果集。

索引填充因子设计:由于日志表数据记录按时间升序追加写入特性加之很少UPDATE操作,因此,索引数据页也具备了按时间升序追加写入的相似特性。所以,我们可以把索引的填充因子调高,可以设置为90 - 95都没有问题,换句话说,我们可以让索引数据页仅留下5% ~ 10%的剩余空间。

索引碎片维护设计:可能没有人会关心发生在两个月前的日志记录,因此,日志表记录会随着时间推移而删除过时的数据(DELETE)。这样也会导致索引碎片随着时间的推移变得越来越高,进而影响查询效率,消耗更多的系统IOPS资源。所以,我们需要定期维护(或重建或者重组)索引。当然,我们可以通过设计优化来避免DELETE操作,从而避免索引碎片的产生,也因此可以避免索引维护的成本。

重要性分析

日志表数据的最大功用是供我们排查应用系统问题时使用的,因此重要性相对于核心业务系统中的业务表数据,没有那么重要,所以我们会定期清理日志表过时数据。但是,它的确实实在在占用了我们昂贵的数据库系统资源。包括:存储开销、系统I/O开销、CPU开销、网络开销、连接开销以及系统吞吐量开销等。因此,针对日志表设计优化也显得尤为重要,

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值