SQLite 在 SSD 磁盘上更新缓慢(1720 条记录需要 15 秒)

发布于 2024-11-08 04:16:35 字数 721 浏览 0 评论 0原文

尊敬的开发人员同事,由于某种原因,在 SSD 磁盘上更新 1720 条记录大约需要 15 秒(尤其是启用了修剪功能时)。

我已经使用以下文档调整了 sqlite 设置(效果很好) http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

我有以下 PRAGMA 集来优化性能,并且我确实在整套更新周围使用事务。

sqlite3_exec(database, "PRAGMA cache_size=500000;", nil, nil, nil);
sqlite3_exec(database, "PRAGMA synchronous=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA count_changes=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA temp_store=MEMORY", nil, nil, nil);

SSD 似乎做了太多事情(比如删除块等),导致它阻塞 15 秒,仅更新 1720 条简单记录。

奇怪的是:插入 2500 条记录几乎是即时的。 您能帮助我并给我一些如何解决这个问题的指导吗?

Dear fellow developer, for some reason updates for 1720 records takes around 15 seconds when on SSD disk (especially when having trim enabled).

I have tweaked the sqlite settings using the following document (which works well)
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

I have the following PRAGMA's set to optimize performance and I DO use transactions around the complete set of updates.

sqlite3_exec(database, "PRAGMA cache_size=500000;", nil, nil, nil);
sqlite3_exec(database, "PRAGMA synchronous=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA count_changes=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA temp_store=MEMORY", nil, nil, nil);

It seems the SSD is doing too much (like deleting blocks and such) which makes it block for 15 seconds for just 1720 simple records update.

Weirdly enough: inserting 2500 records is almost instant.
Can you help me and give me some pointers how to fix this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

转角预定愛 2024-11-15 04:16:35

我通过进行一些良好的旧测试和尝试找到了答案。
当在事务中相继执行大量单个 UPDATE 语句时,sqlite 似乎会在带有 TRIM 的 SSD 上冻结。

我现在更改了代码:
a) 准备一个命令并对所有要更新的记录重复使用该命令。
b) 每 1500 条记录提交并开始一个新事务,

这似乎修复了 sqlite 中的冻结问题。简而言之:重用准备好的 sql 语句并确保事务不会变得太大。

I found the answer by doing some good old testing and trying out.
It seems that sqlite will freeze on SSDs with TRIM when doing a lot of single UPDATE statements after each other in a transaction.

I've changed the code now:
a) prepare a command and reuse that command for all the to-be updated records.
b) COMMIT and BEGIN a new transaction every 1500 records

this seems to have fixed the freeze in sqlite. So in short: reuse the prepared sql statement and make sure the transaction doesn't get too large.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文