我是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]
}
答案 0 :(得分:2)
默认情况下,每次插入都是一次交易。这很慢。您可以将插入组合成单个事务,例如100次插入,并大大加快速度。
db eval { BEGIN TRANSACTION }
... do some insertions ...
db eval { END TRANSACTION }
或
db transaction {
... do some insertions ...
}
开箱即用,SQLITE非常安全,但速度很慢。如果您知道自己在做什么,并且愿意在磁盘崩溃时冒险破坏数据库损坏,那么您可以进行多项优化,以提高速度。
特别是:
如果你还没有探索过所有这些,那么你的运行速度可能比你慢很多。
答案 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