Sqlite学习笔记(三)&&WAL性能测试
WAL是SQLite3.7.0版本引入的一个重大改进。SQLite官网宣称在很多使用场景下,WAL模型的性能都要好于默认的DELETE模式。下面将针对几个主要场景对WAL性能做测试,测试的硬件与xxx保持一致。
纯写场景
1) 测试说明
测试简单更新事务在WAL模式下与DELETE日志模式性能对比,测试语句形如:update user set c1=c1+1 where id=xxx,id为主键,串行执行更新。通过执行1w个更新事务,统计程序运行时间。
2) 测试结果
测试时间结果以毫秒计算,TPS是每秒执行的事务数,通过事务数与时间相比获取结果。
|
WAL模式 |
DELETE模式 |
|
|
第一轮 |
55176 |
159196 |
|
第二轮 |
54442 |
164341 |
|
第三轮 |
56171 |
162329 |
|
第四轮 |
56167 |
166117 |
|
第五轮 |
55969 |
163139 |
|
平均值 |
55581 |
163024 |
|
TPS |
179.9 |
61.3 |
3) 结果分析
从测试结果来看,WAL日志模式下,纯写性能要远远好于DELETE模式,前者大概是后者的3倍。这个性能差异主要源于每次事务提交,WAL模式只需要将更新的日志写入磁盘即可,而DELETE模式修改过程中,首先需要将原始数据页拷贝到日志文件中,并进行fsync;然后再将修改页写入磁盘,同时也需要fsync,确保数据落盘,并且还要将日志文件清除。因此,写事务在WAL模式下,只需要一次fsync,并且是顺序写;而DELETE模式下,需要至少两次fsync(日志,数据),并且更新的数据可能离散分布在多个page中,因此可能需要多个fsync来完成。众所周知,fsync调用是非常耗时的,导致DELTE模式下写性能不如WAL模式。
纯读场景
1) 测试说明
测试WAL模式下,纯读性能数据,测试语句形如:“select * from user where id = xxx”,id为主键,对比WAL模式与DELETE模式下读性能。每个线程执行10w次查询,统计最终执行时间。QPS为每秒执行的查询数
2) 测试结果
|
WAL模式 |
DELETE模式 |
|||
|
2线程 |
4线程 |
2线程 |
4线程 |
|
|
第一轮 |
2847 |
5050 |
4124 |
8168 |
|
第二轮 |
2730 |
5795 |
3833 |
8074 |
|
第三轮 |
2688 |
5675 |
3819 |
8077 |
|
第四轮 |
2959 |
5894 |
3881 |
7787 |
|
第五轮 |
2836 |
5924 |
3873 |
7958 |
|
平均值 |
2817 |
5667 |
3906 |
8012 |
|
QPS |
7w |
7w |
5.1w |
5w |
3) 结果分析
从结果来看,WAL模式下,读性能要好于DELETE模式,大概提高了将近30%。这说明开启WAL模式下,对读性能也有提高。目前我还没有找到性能提升的原因,后续仔细阅读源码后,再做分析。
读写场景
1) 测试说明
在WAL模式下,事务提交时实际是以append方式写wal日志文件,因此读写不冲突;而DELETE模式下,写事务需要写DB(缓存,文件),与读事务读DB(缓存,文件)冲突,因此只能串行读写,通过前面的测试可知,WAL模式下,每秒读写事务数比例大概是500:1;DELETE模式下,每秒读写事务数比例大概是800:1,这里的测试不打算比较读写同时存在时两种模式的对比,而是单独测试WAL,以读写比为500:1场景,看看读写的QPS和TPS是否与单独执行有差异。测试中,读写线程都并发读写同一张表,读采用5个线程,主键查询,每个线程执行100w个读;写采用1个线程,主键更新,执行1w次写。测试时间的单位为毫秒,QPS和TPS分别为每秒的读和写,QPS=500w/时间,TPS=100w/时间。
2) 测试结果
|
WAL模式 |
||
|
第一轮 |
67543 |
|
|
第二轮 |
66812 |
|
|
第三轮 |
72946 |
|
|
第四轮 |
78844 |
|
|
第五轮 |
74501 |
|
|
平均值 |
72129 |
|
|
QPS|TPS |
6.94w |
138 |
3) 结果分析
通过读写比500:1的测试模型,基本保证了读写是同时完成的,从另外一方面来说,就是读写是充分竞争的。从测试结果来看,WAL模式下,读的QPS为6.94w,与单独测试读7w的性能几乎无差异;写的TPS为138, 较单独测试写的179略有下降,这可能与设置的读写比有关系。通过测试结果可以充分说明,WAL模式下,读写是充分并发的,并且几乎没有性能损耗。
批量导入场景
1) 测试说明
这个测试主要了了解WAL模式和DELETE模式下,导入数据性能对比。创建2个表,每个表导入10w条记录,总共20w记录,观察导入的时间。
2) 测试结果
|
WAL模式 |
DELETE模式 |
|
|
第一轮 |
28019 |
18036 |
|
第二轮 |
28500 |
17959 |
|
第三轮 |
28575 |
17578 |
|
第四轮 |
29078 |
18076 |
|
第五轮 |
29184 |
17989 |
|
平均值 |
28671 |
17909 |
|
TPS |
6975 |
11167 |
3) 结果分析
从结果来看,DELETE模式的批量导入性能要好于WAL模式,这主要源于,DELETE模式记录的是old-page,而insert操作没有old-page,所以无需记录日志,而WAL记录的是修改页,所以代价比DELETE模式高。
wal文件大小测试
1) 测试说明
wal模式下,日志采用单独的wal文件,事务将更新写入wal文件,事务执行过程中,不断写wal文件,直到提交后,才有机会做检查点,控制wal文件不继续膨胀。由于端设备,空间资源也非常稀缺,我们来看看wal 模式和delete模式下日志文件对空间的损耗。WAL模式下, wal_autocheckpoint用来控制做检查点时机,这个参数对WAL文件影响至关重要,测试也围绕、这个参数展开。
2) 测试结果
|
场景 |
日志文件容量 |
|
|
WAL模式 |
DELETE模式 |
|
|
批量导入(大事务) |
200M |
4k |
|
主键更新(1w行事务) wal_autocheckpoint=1000 |
20M |
19M |
|
单条更新(单行事务) 更新1w行 wal_autocheckpoint=1000 |
1M |
4k |
|
单条更新事务 更新1w行 wal_autocheckpoint=4000 |
4M |
4k |
|
单条更新事务 更新1w行 wal_autocheckpoint=0 |
42M |
无 |
3) 结果分析
从测试结果来看,批量导入大事务时,测试中DB文件200M,产生的WAL日志文件也是200M,由于是INSERT操作,DELETE模式下,日志文件记录原始数据页,所以依然为4k,这4k应该是控制信息。对于大事务更新操作,WAL模式和DELETE模式产生的日志量基本相当,只不过一个记录修改后的数据,一个记录修改前的数据。对于单行事务,DELETE模式的日志文件基本没有增长,而WAL模式下,日志文件与wal_autocheckpoint参数相关,默认情况下该参数值为1000个page,每个page_size为1k,因此大约为1M;调整为4000后,日志文件也随之膨胀到4M;设置为0,亦即关闭检查点后,更新1w条记录,将使wal膨胀到42M。因此,无论是WAL模式还是DELETE模式,事务大小都对日志文件大小有影响,对于WAL模式,为了控制日志文件大小,wal_autocheckpoint参数非常重要。
Sqlite学习笔记(三)&&WAL性能测试的更多相关文章
- Sqlite学习笔记(四)&&SQLite-WAL原理
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- Sqlite学习笔记(四)&&SQLite-WAL原理(转)
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- SQLite学习笔记(七)&&事务处理
说到事务一定会提到ACID,所谓事务的原子性,一致性,隔离性和持久性.对于一个数据库而言,通常通过并发控制和故障恢复手段来保证事务在正常和异常情况下的ACID特性.sqlite也不例外,虽然简单,依然 ...
- SQLite 学习笔记
SQLite 学习笔记. 一.SQLite 安装 访问http://www.sqlite.org/download.html下载对应的文件. 1.在 Windows 上安装 SQLite. ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
随机推荐
- Chrome的ERR_UNSAFE_PORT解决办法
今天早上来上班照往常一样,打开我的VS,编译运行程序,打不开??又是一阵调试,断点,很快我发现不是我的程序问题,因为在IE,Firefox里都可以正常打开,唯独Chrome报错.又仔细看了下报错页面, ...
- MySQL: LEAVE Statement
https://www.techonthenet.com/mysql/loops/leave.php This MySQL tutorial explains how to use the LEAVE ...
- Phar与Composer
如果你想把PHP玩出像Java那样的花来,那Phar.Composer甚至Phing应该都是必须要玩一遍的. Phar - Php Archive.包管理器,有些类似Java中的jar包,但有所不同. ...
- JPA一对多循环引用的解决
说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...
- java的spilt(“,”)方法bug处理
java split方法以逗号分隔如字符串",,,,,," 这样会得到一个空的数组 String str ={1,2,3,,,,, } String[] str1 =spilt(& ...
- mybatis xml 中的特殊符转义字符号和模糊查询
xml特殊符号转义写法 < < 小于 <= <= 小于或等于 > > 大于 >= >= 大于或等于 <> <> 不等于 & ...
- Java关键字用法及区别
abstract 修饰词表明类或者成员方法具有抽象属性, 用于修饰类时 该类为抽象类 用于方法前 该方法为抽象方法. assert 用来进行程序调试 断言预判的意思. boolean 基本数据类型之一 ...
- Scalaz(20)-Monad: Validation-Applicative版本的Either
scalaz还提供了个type class叫Validation.乍看起来跟\/没什么分别.实际上这个Validation是在\/的基础上增加了Applicative功能,就是实现了ap函数.通过Ap ...
- [css] CSS3中的单位
FROM http://www.qianduan.net/understand-the-unit-of-length-in-the-css.html CSS3中的单位: css3中引入了一些新的单位: ...
- 文件并发(日志处理)--队列--Redis+Log4Net
多线程操作同一个文件时会出现并发问题.解决的一个办法就是给文件加锁(lock),但是这样的话,一个线程操作文件时,其它的都得等待,这样的话性能非常差.另外一个解决方案,就是先将数据放在队列中,然后开启 ...