是高读,但绝对没有写SQLite查询正常吗?

时间:2017-10-11 17:23:15

标签: sql performance sqlite

我一直在运行查询,通过匹配另一个表中的ID来向表中添加列。两者都有大约6亿行,所以这是合理的,这需要一段时间,但令我担心的是,磁盘上有很高的读取速度(~500MB / s)但sqlite根据{{1}写入0B / s }。我的.db文件中的文件大小没有在几小时内改变,但是向一个6亿行表添加一列应至少改变一个字节,不是吗?

这是SQLite的正常行为吗?该机非常强大,Ubuntu 16采用四核i7,配备64GB RAM和NVMe SSD。查询和表模式如下所示。

iotop

2 个答案:

答案 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