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) 

这是 sqlite 显示查询计划:

--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 表中手动删除这两个条目(我知道,不推荐),那么查询会按预期工作。

ObjectsIDXObjects(TypeID,Name) 上的覆盖索引。

ObjectsToFileIDXObjectsToFile(ObjectID,FileID,Counter) 上的覆盖索引。

我无法进一步调试,所以我不确定为什么会有不同的结果。此时唯一的选择是放弃优化并执行数据库升级删除 sqlite_stat1 表,但我更愿意了解发生了什么并正确解决它。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...