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]
}
    
已邀请:
默认情况下,每次插入都是单个事务。这很慢。您可以将插入内容分组为100次插入的单个事务,从而大大加快了处理速度。
db eval { BEGIN TRANSACTION }

... do some insertions ...

db eval {  END TRANSACTION }
要么
db transaction {

... do some insertions ...

}
SQLITE开箱即用,非常安全,但是速度很慢。如果您知道自己在做什么,并且愿意冒着磁盘崩溃而导致数据库损坏的风险,那么您可以通过多种优化来提高速度。 尤其是: 关闭同步(PRAGMA同步= OFF;) 组写入交易 索引表 在内存中使用数据库 如果您还没有探索所有这些,那么您的运行速度可能会慢很多倍。     
我无法回答问题的sqlite部分,因为几年来我都没有使用过sqlite,但是性能下降的一个原因是您的expr语句。您需要将参数放在expr的后面,这将大大加快循环的这一部分:
set z [expr {$z + $x + $y}]
    
是的,从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
然后,使用复制方法,您可以一次读取所有内容:
db copy replace values temp_file
至于计算总和,我不知道为什么您不使用sql本身来进行求和。网上有许多有关如何执行此操作的示例。这是一对。我想你的sql语句将是这样的:
db select sum(x+y) from table
或可能
db select sum(x+y) as z from table
    

要回复问题请先登录注册