SQLite有eval命令吗?

时间:2013-11-21 09:24:38

标签: sql sqlite query-optimization

我在Why is SQLite refusing to use available indexes when adding a JOIN?中引用了一个复合查询的查询。当单独评估查询的段时,生成的查询计划将应用相关的指标并顺利运行。但是,当一起运行(通过JOIN)时,它无法执行此操作。因此,我想知道是否有一种方法可以创建一个在子查询上运行'eval'的查询,并将其传递给外部查询,以强制SQLite使用在单独完成时生成的查询计划。

2 个答案:

答案 0 :(得分:0)

你的另一个问题的答案告诉你原因:当它们没用时,不使用索引。

本质上:

  • 如果在磁盘页面上来回跳转以获取与查询匹配的少量行是最便宜的,则会使用索引。
  • 如果只阅读整个混乱并过滤掉未加工的行是最便宜的,则不使用索引。

某些数据库(例如Postgres)以位图索引扫描的形式在两者之间提供中间级别:它相当于第二个基于索引的飞行前检查,以避免访问不包含匹配的磁盘页面行。

这就是它的全部,真的:几行,索引;很多行,没有索引。

当然,写得不好的查询也不使用索引,但这是出于不同的原因:它们只是混淆了查询规划器,而智能后者并不是全知。特别是,加入联合或聚合是不使用索引的主要方法。 (这就是你在做什么。)

答案 1 :(得分:0)

按照惯例,您应该以这种方式编写查询和索引,以便Sqlite的查询优化器识别最佳索引并只使用它们。

但是,由于您在这种情况下的问题更具体,因此您似乎在寻找相当于SQL Server的{​​{1}}条款。

正如我在FORCE(INDEX)中所读到的那样,有Sqlite条款,虽然似乎INDEXED BY社区对它的看法是分裂的(可能是因为我在我提到的内容)第一句)

link 1 sqlite.org's documentation about it

link 2 for a tutorial on that