【发布时间】:2023-03-16 00:42:01
【问题描述】:
这是我的简化情况
create table t1 (i integer, d text);
insert into t1 values (0,'aa0');
insert into t1 values (1,'aa1');
insert into t1 values (2,'aa2');
insert into t1 values (3,'aa3');
insert into t1 values (4,'aa4');
insert into t1 values (5,'aa5');
insert into t1 values (6,'aa6');
insert into t1 values (7,'aa7');
insert into t1 values (8,'aa8');
insert into t1 values (9,'aa9');
create table t2 (i integer, e text);
insert into t2 values (0,'aa0');
insert into t2 values (1,'ba1');
insert into t2 values (2,'aa2');
insert into t2 values (3,'ba3');
insert into t2 values (4,'aa4');
insert into t2 values (5,'ba5');
insert into t2 values (6,'aa6');
insert into t2 values (7,'ba7');
insert into t2 values (8,'aa8');
insert into t2 values (9,'ba9');
然后我有一个外部 SELECT,其目的是打印出表 t1 以获取 ID (i) 的选择列表
select d from t1 where i in (3,4) limit 4;
d
----
aa3
aa4
ID 集已生成,因此我可以得到
select d from t1 where i in (3,4,1,6,7) limit 4;
d
----
aa1
aa3
aa4
aa6
有时 ID 集是这样的内部 SELECT 子查询的结果
select d from t1 where i in (select i from t2 where e>'b') limit 4;
d
----
aa1
aa3
aa5
aa7
在我的真实案例中,t1 和 t2 很大,内部 SELECT 可以生成一个大 ID 列表,外部选择将使用其限制约束进行核对。
我的问题是,查询优化器是否检测到这个外部限制约束并将其传播到内部选择中?
如果答案是否定的,那么我应该加倍努力,我的查询生成器必须像这样在内部 SELECT 中显式移动限制约束
select d from t1 where i in (select i from t2 where e>'b' limit 4);
d
----
aa1
aa3
aa5
aa7
在询问之前,我查看了 EXPLAIN 和 EXPLAIN QUERY PLAN,但这超出了我的知识范围,无法从那里回答。
【问题讨论】:
标签: sqlite query-optimization subquery-factoring