我一直在开发一个性能关键型应用程序,其中一个涉及的查询具有这种结构(名称已更改,但没有其他内容):
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 库执行的相同查询给出了截然不同的行为。Profiler 数据显示,对于该查询的一次执行,该sqlite3_step()
函数花费的时间约为 120 秒。这个亚秒级的查询在库中需要两分钟,我完全没有解释为什么。
在这两种情况下操作的数据库文件是逐字节相同的。
SQLite 库是 3.7.2 版本,命令行客户端是 3.7.13 版本。我不知道这是否是一个因素,但对我来说似乎不太可能。
我尝试过的事情:
- 清空数据库。性能没有统计学上显着的改善。
- 改变日记模式。由于与这个问题无关的原因,我从使用回滚日志切换到 WAL,但这也确实对性能产生了任何统计上的显着影响。