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 synchronous = off;)
  • 组写入事务
  • <
  • 索引表/gh>
  • 在内存中使用数据库

我不能说这个问题的sqlite部分,因为我已经好几年没有使用sqlite了,但是性能下降的一个原因是你的expr语句。您需要给expr的参数加大括号,这样可以大大加快这部分循环的速度:

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

是的,从Tcl到sql表进行单次插入并不是实现您想要的效果的最快方法。

为了加快速度,您应该将所需的表写入外部文件并将数据写入

你可以这样写数据:

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本身来做求和。网上有很多关于如何做到这一点的例子。这里有几个例子。我想你的sql语句应该是这样的:

db select sum(x+y) from table

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

相关内容

最新更新


热门标签:

javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium