论坛首页 编程语言技术论坛

ActiveRecord插入数据速度比较

浏览 4135 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-30   最后修改:2009-03-30
ORM:ActiveRecord
Database:Sqlite3
一共两种方式,
方式一:通过ORM对象new,然后赋值,最后保存。
方式二:通过ActiveRecord::Base.connection.execute(sql)直接执行,

人家说方式二效率高,所以我想知道真的高假的高,高又能高多少,顺便看看Sqlite3的速度。

主要测试代码如下:

sql7=proc {<<SQL
insert into udb_user(user_id,user_name,creator) 
values("#{(rand*10**20).round}","user#{(rand*10**20).round}",'CuiZheng1')
SQL
}

InsertBySQL=proc do |x|
  proc do
    x.times{ActiveRecord::Base.connection.execute(sql7.call.gsub("\n"," "))}
  end
end

InsertByAR=proc do |x|
  proc do
    x.times do
      _tempUU=UdbUser.new
      _tempUU.USER_ID=(rand*10**20).round.to_s
      _tempUU.USER_NAME="user#{(rand*10**20).round}"
      _tempUU.CREATOR='CuiZheng2'
      _tempUU.save!
    end
  end
end

Benchmark.bm(20) do |x|
  x.report("InsertByAR",&(InsertByAR.call(10**3)))
  x.report("InsertBySQL",&(InsertBySQL.call(10**3)))
end


结果如下:

-----------------------------------------------------------------

                  Insert Records                                   

-----------------------------------------------------------------

                          user     system      total        real

InsertByAR            2.703000   6.891000   9.594000 ( 91.735000)

InsertBySQL           0.578000   6.047000   6.625000 ( 94.265000)


区别不大!

开始跑的时候我打算各插100万条记录,太慢了,而且中途我通过cmd链接到那个sqlite3数据库上,执行了select count(*) ,结果ruby插数据的这个链接断掉了,报错说当前sqlite3链接非常的busy!感觉sqlite3好脆弱啊!

我想可不可以这样用sqlite3,启动的时候把数据库全都加载到内存,所有的增删改操作直接同步的对内存中的sqlite3操作,但放到一个队列里,异步的对sqlite3物理文件操作。
或者这样行不行,把sqlite3启动时加载到memcache里面好了,再启动一个任务定时的attach到物理文件。

反正都是放到内存里,因为感觉sqlite3物理文件的读写很慢,而且并发有问题。
   发表时间:2008-12-30  
sqlite只适合非常小的应用
0 请登录后投票
   发表时间:2008-12-31  
sqlite的锁机制比较简单
它会把整个文件锁上 所以很自然它的并发性能不好

不知道当sqlite作为内存数据库时它是怎么处理锁的 但我猜测不会好太多

期待LZ的进一步测试 :)
0 请登录后投票
   发表时间:2008-12-31  
icefishc 写道

sqlite的锁机制比较简单它会把整个文件锁上 所以很自然它的并发性能不好不知道当sqlite作为内存数据库时它是怎么处理锁的 但我猜测不会好太多期待LZ的进一步测试 :)


好的,我也想测一下呢。
0 请登录后投票
   发表时间:2008-12-31  
我用的是MySQL,使用innodb数据库development.log记录ActiveRecord每个save都会进行一次begin transaction和commit,极大的大数量影响插入速度。Sqlite3使用的也是支持事务的数据库因该也一样。

如果每1000条数据进行一次commit那插入速度会快上百倍乃至千倍
0 请登录后投票
   发表时间:2009-01-08  
antter 写道
我用的是MySQL,使用innodb数据库development.log记录ActiveRecord每个save都会进行一次begin transaction和commit,极大的大数量影响插入速度。Sqlite3使用的也是支持事务的数据库因该也一样。

如果每1000条数据进行一次commit那插入速度会快上百倍乃至千倍

我最近在做的就是每1000条数据作为一个事务。一共是40万条数据。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics