sqlite `pragma optimization`:在启动时在后台线程/连接中运行它怎么样?

问题描述 投票:0回答:1

我正在写网站:用C++,作为nginx模块,使用SQLite。网站的正常运行时间通常很长。我们还假设数据库很大,只是为了从一开始就涵盖所有目的。

我想要快速,包括即时启动/停止。

如果我按照建议在每个连接关闭时运行

pragma optimize
,最终它会冻结思维,系统管理员也会随之思考:为什么 nginx 冻结了?杀了它!如果我每隔几个小时在工作连接上运行
pragma optimize
(每个 nginx 工作线程一个连接),偶尔想到的将是用户。

当然我会提前发出

pragma analyze_limit = 1000
,但我内心的完美主义者仍然抱怨。在
sqlite3_interrupt()
,他抱怨得更多。

因此,我想使用单独的连接运行后台线程,并在那里进行所有维护,包括每隔几个小时进行

pragma optimize
。这是一个非常典型的模式:应用程序内类似 cron 的东西。

问题:

-- 1 -- 与关闭

real
工作连接之前运行 pragma optimize 相比,我会损失多少?

我会抑制MASK位8(自动创建索引,尚未实现),因为我不喜欢有人为我做如此影响深远的决定,更不用说自动做它了。但除此之外,

optimize
至少还会为所有合适的桌子调用
analyze
吗?

-- 2 -- 如果我在后台线程中运行

pragma optimize
它会阻止由工作连接执行的DML吗?

如果没有,那将是理想的:即使系统管理员在之前的优化过程中杀死了 nginx,站点从一开始就能快速运行;即使没有

pragma analyze_limit
,后台线程也将有足够的时间来完成其工作——启动时和每隔几个小时;当所有连接在终止时关闭时,它们的
pragma optimize
为 NOOP 的可能性约为 100%。

谢谢。 :)

sqlite optimization
1个回答
0
投票

我被建议定期(例如在 100K 查询之后)在工作线程中创建新连接,并将旧连接移至后台线程以进行维护和关闭。

© www.soinside.com 2019 - 2024. All rights reserved.