使用许多记录高效更新SQLite表

时间:2010-05-15 03:18:11

标签: c++ python sql database sqlite

我正在尝试使用sqlite(sqlite3)来存储数十万条记录(想要sqlite,所以程序的用户不必运行[my] sql server)。

我必须更新数十万条记录,有时输入左边的值(它们是分层的),但是已经找到了标准

update table set left_value = 4, right_value = 5 where id = 12340;

非常慢。

我尝试过每隔一千左右
begin;
....
update...
update table set left_value = 4, right_value = 5 where id = 12340;
update...
....
commit;

但又一次,很慢。奇怪,因为当我填充数十万(带插入)时,它会在几秒钟内完成。

我目前正在尝试在将其移动到C ++实现之前测试python中的速度(缓慢在命令行和python中),但是现在这种方法很慢,我需要找到一个新的解决方案,除非我做错了什么。思考? (将采用可移植的SQLite的开源替代方案)

2 个答案:

答案 0 :(得分:12)

table.id

上创建索引
create index table_id_index on table(id)

答案 1 :(得分:3)

除了确保您有索引之外,您还可以查看SQLite Optimization FAQ

如您所述,使用交易可以为您带来非常大的速度提升,您也可以尝试关闭日记功能。

示例1:

  

2.2 PRAGMA同步

     

布尔同步值控件   图书馆是否会等待   用于完全写入磁盘写入   磁盘继续之前。这个设置   可以不同于   从中加载的default_synchronous值   数据库。在典型的使用中   图书馆可能会花很多时间   等待文件系统。设置   “PRAGMA synchronous = OFF”可以制作一个   主要的速度差异。

示例2:

  

2.3 PRAGMA count_changes

     

当count_changes设置为ON时,   回调函数被调用一次   对于每个DELETE,INSERT或UPDATE   操作。参数是数字   已更改的行数。如果你   不要使用此功能,有一个   转动这个小的速度增加   关闭。