使用事务提升sqlite insert的性能

标签: 提升 sqlite insert | 发表时间:2014-07-30 19:05 | 作者:kyfxbl
出处:http://blog.csdn.net

昨天发现sqlite插入性能很低,搜索了一下发现,其实sqlite的插入可以做到每秒50000条,但是处理事务的速度慢:

(19) INSERT is really slow - I can only do few dozen INSERTs per second

Actually, SQLite will easily do 50,000 or more  INSERT statements per second on an average desktop computer. But it will only do a few dozen transactions per second. Transaction speed is limited by the rotational speed of your disk drive. A transaction normally requires two complete rotations of the disk platter, which on a 7200RPM disk drive limits you to about 60 transactions per second.

Transaction speed is limited by disk drive speed because (by default) SQLite actually waits until the data really is safely stored on the disk surface before the transaction is complete. That way, if you suddenly lose power or if your OS crashes, your data is still safe. For details, read about  atomic commit in SQLite..

By default, each INSERT statement is its own transaction. But if you surround multiple INSERT statements with  BEGIN... COMMIT then all the inserts are grouped into a single transaction. The time needed to commit the transaction is amortized over all the enclosed insert statements and so the time per insert statement is greatly reduced.

sqlite FAQ#19

我原本的代码没有使用事务,所以每条insert语句都默认为一个事务。解决的办法是加上事务,执行SQL的时间就从10秒缩短到了0.07秒

发现了这个以后,我就尝试把可能的地方都加上事务,但是原本程序有一处逻辑,是执行一大堆insert,如果主键冲突就自然无视。但是如果把这堆sql变成事务,就会影响正确数据的插入,所以又把insert语句改成insert or ignore:

insert or ignore into test (id, key) values (20001, 'kyfxbl');

然后再放到一个事务里,效率大大提升

作者:kyfxbl 发表于2014-7-30 11:05:56 原文链接
阅读:107 评论:0 查看评论

相关 [提升 sqlite insert] 推荐:

使用事务提升sqlite insert的性能

- - CSDN博客移动开发推荐文章
昨天发现sqlite插入性能很低,搜索了一下发现,其实sqlite的插入可以做到每秒50000条,但是处理事务的速度慢:. A transaction normally requires two complete rotations of the disk platter, which on a 7200RPM disk drive limits you to about 60 transactions per second.

MySQL insert性能优化

- - Rebill's Blog
对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是插入时间长. 我们就有一个业务系统,每天的数据导入需要4-5个钟. 这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情. 因此,提高大数据量系统的MySQL insert效率是很有必要的. 经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考.

Android学习笔记(六)SQLite

- - 博客园_首页
SQLite是一个极轻量型的数据库. 它在提供了和大型数据库相当的功能,还具有轻便、跨平台等优点,SQLite使用非常方便,并不需要我们像常规数据库(SQLServer,Mysql等)那样进行安装,在Android的JDK中,其实是已经包含了SQLite这个数据库的核心. 当然我们必须要强调一点,SQLite并不是只针对Android的,其实它还可以用在别的很多地方.

Oracle中Merge Into 代替Insert/Update的应用

- - 数据库 - ITeye博客
在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert). 在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中的记录数.

将Access转为SQLite数据库

- zhouding - 博客园-首页原创精华区
           SQLite是一个轻量型的数据库,各方面由于Access,对于小型网站来说,非常适合. 我今天决定将系统的数据库由Access转换为SQLite. 在网上搜索了一下,找到了DBManager这个工具,不得不说,这个软件确实好,很强大,在网上找注册码也找到半天,找不到一个.            只要将Access转换为SQLite,然后使用System.Data.SQLite.dll来访问数据库.

SQLite的原子提交原理

- way - chensheng.net
本文源自:http://www.sqlite.org/atomiccommit.html,2007/11/28的版本. 本人正在做一个项目,在项目中定义了自己的文件格式,为了做到停电或程序崩溃不损坏这些文件原有的数据,故针对操作的原子性做一些思考,后来看到sqlite的这篇文章,与自己的实现方式作了一些对比.

SQLite数据库存储引擎设计

- - searchdatabase
  SQLite是一个嵌入式库并且实现了零配置、无服务端和事务功能的SQL数据库引擎. 它在广泛领域内被使用,而且单线程读写性能与MySQL比肩,并且保证ACID性.   SQLite的存储后端是采用Btree实现,多个连接可以并发操作,但是同一时间只允许一个写着存在.   SQLite在硬盘上一个数据库一个文件,每个数据库文件头部保存有这个数据库的元信息,包括版本,大小,Btree根节点位置等等.

sqlite插入速度优化方案

- - CSDN博客移动开发推荐文章
先贴上SQLiteOpenHelper的代码,我们创建测试的表是user,它有四个字段id,name,age,height,remark,测试用的小米2,默认条数为100行. // 必须要有这一个构造方法. // 当数据库第一次创建的时候被调用,. // 当调用getReadableDatabase ()或getWritableDatabase 的时候.

Android数据的四种存储方式SharePreference、SQLite、Content Provider和File (二) —— SQLite

- stony - 博客园-首页原创精华区
  SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是:.     INTEGER: 整数.   在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以用INTEGER的0和1代替true和false,而DATE类型则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显示,为了能方便的操作DATE类型,SQLite提供了一组函数,详见:http://www.sqlite.org/lang_datefunc.html.

hibernate insert 时 无主键使用复合主键

- -
复合主键,由多个字段组成主键,例如,使用一个用户的firstname和lastname组成主键. 可以通过两种方式确定主键,一种是基于实体类的复合主键,另一种是通过定义主键类来实现. 不管通过哪种方式,复合主键都需要实现equals方法和hashcode方法,以作为不同数据之间是别的标志. 一.基于实体类属性的复合主键.