sql - 对于简单的乘法,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。任何提示如何提高性能?
解决方案
您正在更新每条记录。这是非常昂贵的。所有操作都需要记录——加上锁定和许多其他开销。
因此,不建议更新每一行。
一种选择是“批量”更新——比如说,一次做 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;
批量插入比更新快得多,因为它们不需要记录每一行。
推荐阅读
- wpf - 如何在 Windows 10 上为 WPF 应用程序的工具栏查找默认图标?
- c++ - c++11如何将十六进制字符串转换为unicode字符串
- pagespeed - Preconnect html vs header:哪个更快?
- database - 使用像 ORM 这样的生成器(如 ActiveRecord 或 Ecto 等)生成 Postgresql 模式
- oop - 如何在类的深层层次结构中使用单例对象
- angular - 在ionic 4中动态选择单选按钮
- javascript - 谷歌图表:时间线在另一个 div 中移动 rowLabel 文本
- umbraco - 使用基于角色的保护获取页面角色
- php - 访问模型关系的问题 Eloquent Model Laravel 5.8
- javascript - 转换和解构参数的 JavaScript 语法是什么?