为什么静态值列表会导致使用" TEMP B-TREE for ORDER BY"?

时间:2017-08-21 14:25:35

标签: sqlite

我有以下数据库:

sqlite> create table t (num number, text text);
sqlite> create index idx on t (num, text);

现在执行:

sqlite> explain query plan select text from t where num=1 order by text;

我期望输出 - 所有这些都是使用覆盖索引完成的。

0|0|0|SEARCH TABLE t USING COVERING INDEX idx (num=?)

现在运行:

sqlite> explain query plan select text from t where num in (1,2) order by text;

输出:

0|0|0|SEARCH TABLE t USING COVERING INDEX idx (num=?)
0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|USE TEMP B-TREE FOR ORDER BY

为什么静态值列表导致使用" TEMP B-TREE FOR ORDER BY"?

1 个答案:

答案 0 :(得分:0)

查询可以从表中读取多行(实际上,从覆盖索引中读取)。 如果以升序索引顺序读取这些行,则text值已经保证正确排序。

通过遍历IN子句中的每个值并查找索引中的匹配行来实现此查询。 这确实恰好是正确的顺序。

但是,SQLite的查询优化器无法证明IN子句的顺序与索引的num顺序相同。因此,它不能省略额外的排序步骤。