Sqlite3-基于事务的批量插入

 

sqlite3单条插入速度在100ms左右,如果插入上万条的数据....

sqlite3默认每插入一条数据都会开启一个事务,执行,关闭

如果批量插入的操作放在一个事务中,避免多此文件打开,写入,关闭,速度会有很大提升!

下面是用benchmark做了一个测试,效果还不错!

 

 

 

require 'sqlite3'
require 'active_support/all'

def creat_table(db,table_name)
    db.execute <<-SQL
    create table "#{table_name}" (
      name varchar(30),
      val int
    );
  SQL
end


def test_insert_with_no_transaction(db, count)
    s = Benchmark.ms do 
       1.upto count do |index|
          db.execute "insert into numbers values ( ?, ? )", "ss", index
       end
     end	
     p s
end

def test_insert_with_modo_transaction(db, count, modo)
    s = Benchmark.ms do 
       db.transaction(modo) do |db|
	  1.upto count do |index|
	     db.execute "insert into numbers values ( ?, ? )", "ss", index
    	  end
       end
     end	
     p s
end


db = SQLite3::Database.new( "test.db" )
p db.transaction_active?
#creat_table(db,"numbers")
count = 100
test_insert_with_no_transaction(db, count)
test_insert_with_modo_transaction(db, count, :deferred)
test_insert_with_modo_transaction(db, count,:immediate)
test_insert_with_modo_transaction(db, count,:exclusive)

 

 

#插入10000条的结果:速度提升100倍!
#45263.549194
#491.27984200000003
#408.979
#492.315361

你可能感兴趣的:(sqlite,批量插入,insert,插入,sqlite事务)