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

标签 sql sqlite

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

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/

相关文章:

sql - 使用 where 子句使用 "Select query"更新表

c# - 如何使用 Entity Framework 获取列的最大值?

iOS SQLite 文件保存不持久

sqlite - 具有自引用外键的 Alembic SQLite ALTER TABLE

sqlite - 如何在sqlite 2数据库表中添加列

python - 简单的 CLI 待办事项管理器与 sqlite3 数据库存储问题

mysql - 想要删除 mysql 中同一属性的多行而不是第一行?

mysql - 如果其中一个查询返回 null,如何防止 MySql Cross Join Query 返回零结果

sql - 如何在postgresql中为可选参数编​​写函数?

c# - SQL查询的转换结果-System.InvalidCastException