gpt4 book ai didi

sql - 对于相同的查询,SQLite命令行客户端和SQLite库之间的性能不同

转载 作者:行者123 更新时间:2023-12-03 17:59:21 26 4
gpt4 key购买 nike

我一直在研究性能至关重要的应用程序,其中涉及的查询之一具有以下结构(名称已更改,但仅此而已):

SELECT x.* FROM a
LEFT OUTER JOIN (
SELECT c_a, c_b, c_c
FROM b
UNION ALL
SELECT c_a, c_b, c_c
FROM c
) AS x
ON a.c_a = x.c_a
WHERE a.c_d = ?
ORDER BY a.c_a


我在此查询上运行了 EXPLAIN QUERY PLAN,所有索引似乎都已正确使用。使用命令行客户端,此查询将在大约0.75秒内完成。考虑到数据库中的数据量,这是我期望的。

但是,通过SQLite库执行的同一查询会产生截然不同的行为。探查器数据显示,对于该查询的一次执行,在 sqlite3_step()函数中花费的时间约为120秒。这个不到一秒的查询需要花费两分钟的时间,对于原因,我绝对没有任何解释。

两种情况下都被操作的数据库文件是逐字节相同的。

SQLite库的版本为3.7.2,命令行客户端的版本为3.7.13。我不知道这是否是一个因素,但对我来说似乎不太可能。



我尝试过的事情:


清理数据库。绩效没有统计学上的显着提高。
更改日记模式。由于与该问题无关的原因,我从使用回滚日志切换为WAL,但这确实对性能产生了统计上的显着影响。

最佳答案

为了封闭观察者和参与者,升级到SQLite 3.7.13似乎已经解决了这个问题。现在在sqlite3_step()中花费了1.5秒,这显然是一个巨大的进步。 3.7.2似乎存在一些错误或缺少优化,这些错误扩大了执行查询所需的时间。

其他行为异常的实例还包括60秒的倍数延迟。这可能表明3.7.2中已解决了与锁相关的错误(请参见EthanB's answer)。

关于sql - 对于相同的查询,SQLite命令行客户端和SQLite库之间的性能不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com