SQLite查询的高读但绝对不写是正常的吗?

SQLite查询的高读但绝对不写是正常的吗?,sql,performance,sqlite,Sql,Performance,Sqlite,我一直在运行一个查询,通过匹配另一个表的ID向表中添加一列。两者都有大约6亿行,所以这需要一段时间,这是合理的,但让我担心的是,磁盘上有很高的读取速度(~500MB/s),但sqlite根据iotop写入0B/s。my.db文件上的文件大小在几个小时内没有更改,但是向6亿行表中添加一列至少会更改一个字节,不是吗 这是SQLite的正常行为吗?这台机器非常强大,Ubuntu16在四核i7上,带有64GB RAM和NVMe SSD。查询和表模式如下所示 ALTER TABLE tableA ADD

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

这是SQLite的正常行为吗?这台机器非常强大,Ubuntu16在四核i7上,带有64GB RAM和NVMe SSD。查询和表模式如下所示

ALTER TABLE tableA ADD address TEXT;
UPDATE tableA SET address = (SELECT address FROM tableB WHERE tableA.ID = tx_out.ID);

Table schema:
CREATE TABLE tableA (
    ID TEXT,
    column1 INT,
    column2 TEXT,
);

CREATE TABLE tx_out (
    ID TEXT,
    sequence INT,
    address TEXT
);
太大了,不能评论

我已经运行了好几天,没有任何变化……我认为它很容易以某种方式锁定自己,在第三天似乎没有变化的情况下,我杀死了它。我在尝试添加新索引时也遇到了类似的问题,但在我达到3天杀戮阈值之前的2天内成功完成了该索引;)可能3天还不够

我现在的首选方法是创建第二个具有新列的表,使用旧列和新列中的数据加载该表,将旧表重命名为X_oldtablename,将新表重命名为表名。在确信新表工作正常后,运行测试并删除x_oldtablename

我已经运行了好几天,没有任何变化……我认为它很容易以某种方式锁定自己,在第三天似乎没有变化的情况下,我杀死了它。我在尝试添加新索引时也遇到了类似的问题,但在我达到3天杀戮阈值之前的2天内成功完成了该索引;)可能3天还不够


我现在的首选方法是创建第二个具有新列的表,使用旧列和新列中的数据加载该表,将旧表重命名为X_oldtablename,将新表重命名为表名。在确信新表正常工作后运行测试并删除x_oldtablename

添加列几乎不会改变磁盘上的任何内容;如果一行的值少于表中的列,则假定缺少的列中有空值

更新速度非常慢,因为子查询必须扫描整个
tx\u out
表中
tableA
中的每一行。 您可以通过
tx\u 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

添加列几乎不会改变磁盘上的任何内容;如果一行的值少于表中的列,则假定缺少的列中有空值

更新速度非常慢,因为子查询必须扫描整个
tx\u out
表中
tableA
中的每一行。 您可以通过
tx\u 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

也许先写事务日志@lad2025可能是,我在每个文档中找到了一个日志文件,但它只有25KB,对于如此大的事务来说这正常吗?可能是先写入事务日志@lad2025可能是,我在每个文档中找到了一个日志文件,但它只有25KB,对于如此大的事务来说这正常吗?是的,我现在肯定很担心,没有硬盘空间来制作副本,但是另一个用户推荐了一个索引,所以我现在就这么做。也许这对你的加入也有帮助?幸运的是,我现在肯定很担心,没有硬盘空间来制作拷贝,但是另一个用户推荐了一个索引,所以我现在就这么做。也许这对你的加入也有帮助?祝你好运这很有意义,我没有足够的磁盘空间来复制表,但是索引听起来是个好主意。如果有来自谷歌的人来到这里,这本指南真的帮助我理解了索引的WTF以及如何使用它们。谢谢你的建议@CL@jamzsabb-记住索引也占用磁盘空间。这是有道理的,我没有磁盘空间来复制表,但是索引听起来是个好主意。如果有来自谷歌的人来到这里,这本指南真的帮助我理解了索引的WTF以及如何使用它们。谢谢你的建议@CL@jamzsabb-记住索引也会占用磁盘空间。