我在Why is SQLite refusing to use available indexes when adding a JOIN?中引用了一个复合查询的查询。当单独评估查询的段时,生成的查询计划将应用相关的指标并顺利运行。但是,当一起运行(通过JOIN)时,它无法执行此操作。因此,我想知道是否有一种方法可以创建一个在子查询上运行'eval'的查询,并将其传递给外部查询,以强制SQLite使用在单独完成时生成的查询计划。
答案 0 :(得分:0)
你的另一个问题的答案告诉你原因:当它们没用时,不使用索引。
本质上:
某些数据库(例如Postgres)以位图索引扫描的形式在两者之间提供中间级别:它相当于第二个基于索引的飞行前检查,以避免访问不包含匹配的磁盘页面行。
这就是它的全部,真的:几行,索引;很多行,没有索引。
当然,写得不好的查询也不使用索引,但这是出于不同的原因:它们只是混淆了查询规划器,而智能后者并不是全知。特别是,加入联合或聚合是不使用索引的主要方法。 (这就是你在做什么。)
答案 1 :(得分:0)
按照惯例,您应该以这种方式编写查询和索引,以便Sqlite
的查询优化器识别最佳索引并只使用它们。
但是,由于您在这种情况下的问题更具体,因此您似乎在寻找相当于SQL Server
的{{1}}条款。
正如我在FORCE(INDEX)
中所读到的那样,有Sqlite
条款,虽然似乎INDEXED BY
社区对它的看法是分裂的(可能是因为我在我提到的内容)第一句)