no_pullup_subquery

用在子查询中,表示不提升子查询。

举例:

--  清理环境
DROP TABLE a CASCADE;
DROP TABLE b CASCADE;
DROP TABLE c CASCADE;

--  创建表
CREATE TABLE a(a1 INT, a2 INT);
CREATE TABLE b(b1 INT, b2 INT);
CREATE TABLE c(c1 INT, c2 INT);


explain select * from a,b,c where a.a1=b.b1 and b.b1 in (
    select /*+ no_pullup_subquery */ c1 from c where c.c2>6);
QUERY PLAN(text)      
----------------------
Nested Loop(Inner Join)  (cost=1097.15..27491493.72 rows=1374389535 width=24)
  ->  Merge Join(Inner Join)  (cost=999.04..3536.10 rows=167772 width=16)
        Merge Cond: ("outer".B1 = "inner".A1)
        ->  Sort  (cost=376.64..386.88 rows=4096 width=8)
              Sort Key: B1
              ->  Seq Scan on B  (cost=0.00..130.88 rows=4096 width=8)
                    Filter: (hashed subplan)
                    SubPlan
                      ->  Seq Scan on C  (cost=0.00..110.40 rows=2731 width=4)
                            Scan Key: (C2 > 6)
        ->  Sort  (cost=622.40..642.88 rows=8192 width=8)
              Sort Key: A1
              ->  Seq Scan on A  (cost=0.00..89.92 rows=8192 width=8)
  ->  Materialize  (cost=98.11..180.03 rows=8192 width=8)
        ->  Seq Scan on C  (cost=0.00..89.92 rows=8192 width=8)
总数目:15

--  删除表
DROP TABLE a CASCADE;
DROP TABLE b CASCADE;
DROP TABLE c CASCADE;