我一直在运行查询,通过匹配另一个表中的ID来向表中添加列。两者都有大约6亿行,所以这是合理的,这需要一段时间,但令我担心的是,磁盘上有很高的读取速度(~500MB / s)但sqlite根据{{1}写入0B / s }。我的.db文件中的文件大小没有在几小时内改变,但是向一个6亿行表添加一列应至少改变一个字节,不是吗?
这是SQLite的正常行为吗?该机非常强大,Ubuntu 16采用四核i7,配备64GB RAM和NVMe SSD。查询和表模式如下所示。
iotop
答案 0 :(得分:2)
添加列几乎不会在磁盘上发生任何变化;假定值具有比表具有列更少的行,则假定在缺少的列中具有NULL。
UPDATE非常慢,因为子查询必须扫描tx_out
中每行的整个 tableA
表。
您可以使用tx_out.ID
列上的索引大大加快速度。
当数据库必须重写所有行并且你有磁盘空间时,最好创建一个新表:
INSERT INTO NewTable(ID, col1, col2, address)
SELECT ID, col1, col2, address
FROM tableA
JOIN tableB USING (ID); -- also needs an index to be fast
答案 1 :(得分:1)
评论太大
我已经连续几天没有变化......我认为它很容易以某种方式锁定自己,我在第3天之后将其杀死,看似没有任何变化。我在尝试添加新索引时遇到了非常类似的问题,但是在我达到3天杀死阈值之前的2天内成功完成了;)可能的3天还不够?
我现在的首选是创建一个具有新列的第二个表,使用旧的加上新列的数据加载表,将旧表重命名为X_oldtablename,将新表重命名为表名。在确信新表正在运行后运行测试并删除x_oldtablename