如何解决Sqlite SELECT 语句在优化的数据库上返回不同的结果
我们使用的是 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 举报,一经查实,本站将立刻删除。