首页 > 解决方案 > 对于简单的乘法,Sqlite 更新表的速度真的很慢

问题描述

我正在使用 python3 和 sqlite3 对一个大表(数据库中的 1,1 GB 和这个表中的大约 700 万行)进行相对简单的转换。目的是在所有行中将两个字段与 -1 相乘。

我的查询是

"UPDATE 'channel_data' SET 
    'x_uncompensated_m'=-1*'x_uncompensated_m',
    'y_compensated_m'=-1*'y_compensated_m'"

更新似乎需要很长时间,所以需要几分钟。日志文件增长到大约 540 MB,而原始数据库大约有 1.1 GB。任何提示如何提高性能?

标签: sqlpython-3.xsqlite

解决方案


您正在更新每条记录。这是非常昂贵的。所有操作都需要记录——加上锁定和许多其他开销。

因此,不建议更新每一行。

一种选择是“批量”更新——比如说,一次做 10,000 个。另一种是重新创建表:

create table temp_channel_data as
    select . . .,  -- all the other columns
           -1*x_uncompensated_m as new_x,
           -1*y_uncompensated_m as new_y
    from channel_data;

然后以某种方式备份表(这样你就不会犯大错)。并清空它并重新填充它:

truncate table channel_data;

insert into channel_data ( . . . )  -- list the columns here
    select . . .                    -- list the columns here
    from temp_channel_data;

批量插入比更新快得多,因为它们不需要记录每一行。


推荐阅读