sqlite `pragma optimize`:如何在后台线程/连接中运行它,在启动时?

yc0p9oo0  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(168)

我在写网站:在C++中,作为nginx模块,使用SQLite。网站的浏览量通常很大。让我们也假设一个巨大的数据库,只是为了从一开始就覆盖所有的端点。
我希望它快速,包括即时启动/停止。
如果我按照建议在每个连接关闭时运行pragma optimize,最终它将冻结思维,并沿着运行系统管理员:为什么Nginx冻结了?如果我每隔几个小时在工作连接上运行pragma optimize(每个nginx工作线程一个连接),偶尔会想到的会是用户。
当然,我会事先发出pragma analyze_limit = 1000,但我内心的完美主义者仍然抱怨。在sqlite3_interrupt()上,他抱怨得更多。
所以,我想用单独的连接运行后台线程,并在那里做所有的维护,包括每隔几个小时的pragma optimize。这是一个非常典型的模式:应用程序内类似cron的东西。

问题:
-- 1 --与关闭真实的工作连接之前运行pragma optimize相比,我会损失多少?

我将抑制MASK位8(自动创建索引,尚未实现),因为我不喜欢有人为我做如此深远的决定,更不用说自动做了。但除此之外,optimize是否至少仍会为所有适当的表调用analyze

**-- 2 --**如果我在后台线程中运行pragma optimize是否会阻塞worker连接执行的DML?

如果没有,那就太理想了:网站将从一开始就工作得很快,即使在以前的优化过程中系统管理员杀死了nginx;即使没有pragma analyze_limit,后台线程也有足够的时间来完成它的工作--在启动时和每隔几个小时;当所有连接在终止时关闭时,它们的pragma optimize将是NOOP的可能性约为100%。

Thanks.:)

fslejnso

fslejnso1#

我被建议定期(例如,在10万次查询后)在工作线程中创建新的连接,并将旧的连接移动到后台线程进行维护和关闭。
至于我的想法,运行优化在单独的连接工作,位4的pragma optimize掩码必须实现。

相关问题