ここで私の合理化された状況
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');
次に、IDの選択リストのテーブルt1を出力することを目的とする外部SELECTがあります(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 はその制限制約で核攻撃します。
私の質問は、クエリ オプティマイザーがこの外側の制限制約を検出し、それを内側の選択に伝達するかどうかです。
答えが NO の場合は、さらに一歩進んで、クエリ ジェネレーターが、このように内側の 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 を見ましたが、これは私の知識を超えており、そこから回答できませんでした。