SQLite优化方法

发布时间:2018-11-15  栏目:sqlite  评论:0 Comments

譬如说:向数据库被插100万长长的数,在默认的情事下而仅仅是实践

SQLite的数据库本质上来讲就是是一个磁盘上的文本,所以任何的数据库操作实际都见面转化为对文件的操作,而频繁之文书操作以会是一个格外好时之经过,会大地影响数据库存取的快慢。

sqlite3_exec(db, “insert into name values ‘lxkxf’, ‘24′; ”, 0, 0,
&zErrMsg);

 

拿会再的开拓关闭数据库文件100万坏,所以速度自然会异常缓慢。因此对这种情形咱应当利用“事务”。

诸如:向数据库中插100万长数,在默认的景下要单是实施 
sqlite3_exec(db, “insert into name values ‘lxkxf’, ‘24′; ”, 0, 0,
&zErrMsg); 
将会晤再也的开拓关闭数据库文件100万不好,所以速度自然会老缓慢。因此于这种状况我们理应运用“事务”。 
具体方法如下:在实施SQL语句之前和SQL语句执行了之后加上 
rc = sqlite3_exec(db, “BEGIN;”, 0, 0, &zErrMsg); 
//执行SQL语句 
rc = sqlite3_exec(db, “COMMIT;”, 0, 0, &zErrMsg);

具体方法如下:在尽SQL语句之前和SQL语句执行了后加上

然SQLite将将全部比方实施的SQL语句先缓存在内存当中,然后等及COMMIT的当儿一次性的状副数据库,这样数据库文件就被辟关闭了平糟,效率自然大大的提高。有同样组数相比:

rc = sqlite3_exec(db, “BEGIN;”, 0, 0, &zErrMsg);

测试1: 1000 INSERTs 
CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100)); 
INSERT INTO t1 VALUES(1,13153,’thirteen thousand one hundred fifty
three’); 
INSERT INTO t1 VALUES(2,75560,’seventy five thousand five hundred
sixty’); 
… 995 lines omitted 
INSERT INTO t1 VALUES(998,66289,’sixty six thousand two hundred eighty
nine’); 
INSERT INTO t1 VALUES(999,24322,’twenty four thousand three hundred
twenty two’); 
INSERT INTO t1 VALUES(1000,94142,’ninety four thousand one hundred forty
two’); 
SQLite 2.7.6: 
13.061 
SQLite 2.7.6 (nosync): 
0.223

//执行SQL语句

测试2: 使用事务 25000 INSERTs 
BEGIN; 
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100)); 
INSERT INTO t2 VALUES(1,59672,’fifty nine thousand six hundred seventy
two’); 
… 24997 lines omitted 
INSERT INTO t2 VALUES(24999,89569,’eighty nine thousand five hundred
sixty nine’); 
INSERT INTO t2 VALUES(25000,94666,’ninety four thousand six hundred
sixty six’); 
COMMIT; 
SQLite 2.7.6: 
0.914 
SQLite 2.7.6 (nosync): 
0.757

rc = sqlite3_exec(db, “COMMIT;”, 0, 0, &zErrMsg);

看得出使用了业务之后也是庞大的加强了数据库的频率。但是我们也只要专注,使用工作也是生必然的付出的,所以对数据量很有些之操作可以不必下,以免导致而外的损耗。

如此SQLite将把方方面面而实行之SQL语句先缓存在内存当中,然后等及COMMIT的当儿一次性的描绘副数据库,这样数据库文件就吃辟关闭了一致潮,效率自然大大的加强。有一致组数对比:

 

测试1: 1000 INSERTs

internalstaticvoid FastInsertMany(DbConnection cnn)

{

using (DbTransaction dbTrans = cnn.BeginTransaction())

{

using (DbCommand cmd = cnn.CreateCommand())

{

    try

   {

cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";

DbParameter Field1 = cmd.CreateParameter();

cmd.Parameters.Add(Field1);

for (int n = 0; n < 100000; n++)

{

Field1.Value = n + 100000;

cmd.ExecuteNonQuery();

}

}

  dbTrans.Commit();

   }

   catch

   {

     dbTrans.RollBack();

   }

}

}

CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t1 VALUES(1,13153,’thirteen thousand one hundred fifty
three’);
INSERT INTO t1 VALUES(2,75560,’seventy five thousand five hundred
sixty’);
… 995 lines omitted
INSERT INTO t1 VALUES(998,66289,’sixty six thousand two hundred eighty
nine’);
INSERT INTO t1 VALUES(999,24322,’twenty four thousand three hundred
twenty two’);
INSERT INTO t1 VALUES(1000,94142,’ninety four thousand one hundred forty
two’);

 

SQLite 2.7.6:
13.061

SQLite 2.7.6 (nosync):
0.223

测试2: 使用事务 25000 INSERTs

BEGIN;
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t2 VALUES(1,59672,’fifty nine thousand six hundred seventy
two’);
… 24997 lines omitted
INSERT INTO t2 VALUES(24999,89569,’eighty nine thousand five hundred
sixty nine’);
INSERT INTO t2 VALUES(25000,94666,’ninety four thousand six hundred
sixty six’);
COMMIT;

SQLite 2.7.6:
0.914

SQLite 2.7.6 (nosync):
0.757

可见使用了事情之后也是庞大的加强了数据库的频率。但是咱呢要是留意,使用工作也是有肯定的出的,所以对于数据量很有点的操作可以不必下,以免造成而外的损耗。

你或许感兴趣之稿子:

  • Android开发之SQLite的利用方式
  • SQLite 汉语指南之FAQ
  • SQLite中之B-Tree实现细节解析
  • sqlite中文乱码问题由来剖析以及缓解
  • SQLite3中的日期时函数使用小结
  • sqlite3
    top的查询及limit语法介绍
  • Sqlite 常用函数 推荐
  • SQLite 错误码整理
  • sQlite常用语以及sQlite
    developer的动与注册

留下评论

网站地图xml地图