tcl数据库插入和检索速度慢

时间:2011-04-14 09:50:23

标签: sqlite tcl

我是tcl的新手。我已连接到SqLite数据库。

我有大约100,000条记录,我想在计算后插入数据库。我使用以下命令将记录插入数据库100,000次。

我确信我在这里做错了。这样做的适当方法是什么?

插入:

db eval {insert into table values(value1,value2,value3,value4)} 

对于检索我必须至少进行1000次选择操作,事情非常缓慢:

db eval {select x as x, y as y from table} {
   set z  [expr $z + $x + $y]
}

3 个答案:

答案 0 :(得分:2)

默认情况下,每次插入都是一次交易。这很慢。您可以将插入组合成单个事务,例如100次插入,并大大加快速度。

db eval { BEGIN TRANSACTION }

... do some insertions ...

db eval {  END TRANSACTION }

db transaction {

... do some insertions ...

}

开箱即用,SQLITE非常安全,但速度很慢。如果您知道自己在做什么,并且愿意在磁盘崩溃时冒险破坏数据库损坏,那么您可以进行多项优化,以提高速度。

特别是:

  • 关闭同步(PRAGMA synchronous = OFF;)
  • 群组写入交易
  • 索引表
  • 在内存中使用数据库

如果你还没有探索过所有这些,那么你的运行速度可能比你慢很多。

答案 1 :(得分:0)

我不能对问题的sqlite部分说话,因为我在几年内没有使用过sqlite,但是性能下降的一个原因是你的expr语句。你需要支持expr的参数,这应该大大加快你的循环部分:

set z [expr {$z + $x + $y}]

答案 2 :(得分:0)

是的,从Tcl单个插入到sql表中并不是实现目标的最快方法。

为了加快速度,您应该将所需的表格写入外部文件并将数据插入其中 使用单个db语句。

你会像这样写出数据:

set fh [open temp_file w]
set rowid 0
# loop
  puts $fh [join [list $value1 $value2 $value3 $value4] \t]
# end loop
close $fh

然后,使用copy方法,您可以一次性阅读所有内容:

db copy replace values temp_file

至于计算总和,我不知道为什么你不使用sql本身来进行求和。网上有很多关于如何做到这一点的例子。这里are a couple。我想你的sql语句是这样的:

db select sum(x+y) from table

或可能

db select sum(x+y) as z from table