【发布时间】:2020-06-26 00:19:46
【问题描述】:
我有一个如下所示的表格:
CREATE TABLE records (
batchID TEXT,
A TEXT,
A_id REAL,
B TEXT,
B_id REAL,
C REAL,
D REAL,
E REAL,
F REAL,
G REAL,
H REAL,
color REAL,
repair REAL,
data BLOB,
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
)
我在某些列的表格上有一个索引。 由于诚信不是问题,我有:
PRAGMA synchronous = "0"
PRAGMA journal_mode = "OFF"
数据库经常插入,我的记录表中有大约 200 万行,数据库文件大小约为 2GB。 每隔几个小时,我需要从记录表中删除 200K 行。我正在使用节点 js orm:
db.driver.execQuery('DELETE FROM records WHERE A IN ? AND batchID = ?',
[['a1', 'a2'], 'batch123'],
function(err) {
// do stuff here
});
一开始删除大约需要 10 秒,但是,运行一个月后,删除语句可能需要一个多小时 (!)(请参阅我记录删除时间的日志中的附加性能图 - 橙色圆圈,蓝色圆圈是节点的内存)。 这是一个问题,因为在删除时节点中会生成新的写入请求。这些写请求在内存中排队到一个点节点使用大量内存。 (因为删除会锁定表并阻止写入)
我怀疑这是因为数据库变得支离破碎。 真空对我来说不是一个选项,因为这是一个无法停止的产品,当我在 sqlite db 文件的副本上测试真空时间时,它需要 15 到 30 分钟。 据我了解,自动清理不会有帮助,因为它不会压缩页面中的数据,并且会加剧碎片化。 我还尝试将页面大小设置为 4096,这也没有帮助。performance graph
【问题讨论】:
-
你确定删除是在第二个发生的吗?
-
抱歉,我不得不编辑我的问题,如果您的评论看起来不相关,请见谅。
-
现在真的是一个不同的问题:-)。我对其进行了编辑,仅更改了表格的格式。你提到你有一些索引。哪个?知道这一点很重要。也可以看看stackoverflow.com/help/how-to-ask,它为如何写一个问题提供了很好的建议。