问题描述
我们使用的是 sqlite 3.27.2 版。根据 sqlite 在此处 https://sqlite.org/lang_analyze.html 的建议,我们在关闭数据库时运行 Pragma optimize(0x02)
。但是,我们遇到了一个错误,即根据 sqlite_stat1
表是否存在,select 语句的结果会有所不同。
查询:
SELECT disTINCT o.ObjectID,o.Name FROM Objects o
JOIN ObjectsToFile AS o2f USING(ObjectID)
WHERE o.Type = 4 AND o2f.FileID IN (SELECT FileID FROM timestepsToFile WHERE timestepID = 1)
--SEARCH TABLE Objects AS o USING COVERING INDEX ObjectsIDX (Type=?)
--SEARCH TABLE ObjectsToFile AS o2f USING COVERING INDEX ObjectsToFileIDX (ObjectID=? AND FileID=?)
\--LIST SUBQUERY1
\--SEARCH TABLE timestepsToFile USING COVERING INDEX sqlite_autoindex_timestepsToFile_1 (timestepID=?)
优化到位后,查询结果返回 1 个对象。没有优化,结果是 15 个对象,这是预期的。
sqlite_stat1 表中的相关行:
tbl | idx | stat
--------------------------------------------
Objects | ObjectsIDX | 112 23 2
ObjectsToFile | ObjectsToFileIDX | 112 1 1 1
如果我从 sqlite_stat1 表中手动删除这两个条目(我知道,不推荐),那么查询会按预期工作。
ObjectsIDX
是 Objects(TypeID,Name)
上的覆盖索引。
ObjectsToFileIDX
是 ObjectsToFile(ObjectID,FileID,Counter)
上的覆盖索引。
我无法进一步调试,所以我不确定为什么会有不同的结果。此时唯一的选择是放弃优化并执行数据库升级以删除 sqlite_stat1 表,但我更愿意了解发生了什么并正确解决它。谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)