功能描述
通过predpush_same_level Hint 来指定同层表或物化视图之间参数化路径生成。
语法格式
predpush_same_level(src, dest)
predpush_same_level(src1 src2 ..., dest)
本参数仅在rewrite_rule 中的predpushforce 选项打开时生效。
示例
准备参数和表及索引:
GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
580
gsql=# set rewrite_rule = 'predpushforce';
SET
gsql=# create table t1(a int, b int);
CREATE TABLE
gsql=# create table t2(a int, b int);
CREATE TABLE
gsql=# create index idx1 on t1(a);
CREATE INDEX
gsql=# create index idx2 on t2(a);
CREATE INDEX
执行语句查看计划:
gsql=# explain select * from t1, t2 where t1.a = t2.a;
QUERY PLAN
------------------------------------------------------------------
Hash Join
(cost=27.50..56.25 rows=1000 width=16)
Hash Cond: (t1.a = t2.a)
->
Seq Scan on t1
(cost=0.00..15.00 rows=1000 width=8)
->
Hash
(cost=15.00..15.00 rows=1000 width=8)
->
Seq Scan on t2
(cost=0.00..15.00 rows=1000 width=8)
(5 rows)
可以看到t1.a = t2.a 条件过滤在Join 上面,此时可以通过predpush_same_level(t1, t2)将
条件下推至t2 的扫描算子上:
gsql=# explain select /*+predpush_same_level(t1, t2)*/ * from t1, t2 where t1.a = t2.a;
QUERY PLAN
---------------------------------------------------------------------
Nested Loop
(cost=0.00..335.00 rows=1000 width=16)
->
Seq Scan on t1
(cost=0.00..15.00 rows=1000 width=8)
->
Index Scan using idx2 on t2
(cost=0.00..0.31 rows=1 width=8)
Index Cond: (a = t1.a)
(4 rows)
predpush_same_level 可以指定多个src,但是所有的src 必须在同一个条件中。
如果指定的src 和dest 条件不存在,
或该条件不符合参数化路径要求,
则本hint 不生效。
GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
581