SQLite是否通过外部约束优化嵌套查询

SQLite是否通过外部约束优化嵌套查询,sqlite,Sqlite,假设我有一个这样的问题 select * from (select t.a as a from t) as t0 where t0.a = 10 SQLite是从t中提取所有数据然后按t0.a=10过滤掉,还是直接从t中提取t.a=10的数据 这就是我是怎么想出来的。让我们用一些数据创建一个示例数据库: CREATE TABLE t(a integer primary key); WITH seq(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM s

假设我有一个这样的问题

select * 
from
  (select t.a as a from t) as t0
where
  t0.a = 10
SQLite是从t中提取所有数据然后按t0.a=10过滤掉,还是直接从t中提取t.a=10的数据

这就是我是怎么想出来的。让我们用一些数据创建一个示例数据库:

CREATE TABLE t(a integer primary key);
WITH seq(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM seq WHERE n<100) INSERT INTO t SELECT * FROM seq;
当我们使用子查询时:

sqlite> EXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM t) t0 WHERE t0.a=10;
0|0|0|SEARCH TABLE t USING INTEGER PRIMARY KEY (rowid=?)
如您所见,它在这两种情况下都使用索引。事实上,这些计划是相同的

通常,您应该使用
EXPLAIN QUERY PLAN
查看sqlite如何执行查询,并确定是否需要创建一些索引、修改查询等

sqlite> EXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM t) t0 WHERE t0.a=10;
0|0|0|SEARCH TABLE t USING INTEGER PRIMARY KEY (rowid=?)