对于以PBE方式(Parse Bind Execute)执行的查询语句和DML语句,优化器会基于规则、代价、参数等因素选择生成Custom Plan或Generic Plan执行。用户可以通过use_cplan/use_gplan的hint指定使用哪种计划执行方式。
- 对于非PBE方式执行的SQL语句,设置本hint不会影响执行方式。
- 本Hint的优先级仅高于基于代价的选择和plan_cache_mode参数,即plan_cache_mode无法强制选择执行方式的语句本hint也无法生效。
Custom Plan 定制计划
是指对于preapre语句,在执行execute的时候,把execute语句中的参数嵌套到语句之后生成的计划。会根据execute语句中具体的参数生成计划,这种方案的优点是每次都按照具体的绑定变量值生成优选计划,执行性能比较好。
Generic Plan 通用计划
是指对于preapre语句生成计划,该计划策略会在执行execute语句的时候把参数bind到plan中,然后执行计划。类似于Oracle的Bind Peeking(绑定变量窥探)。
两种执行方式的优缺点。
执行方式 | 优点 | 缺点 |
---|---|---|
Custom Plan | SQL执行性能比较好 | 缺点是每次执行前都需要重新生成计划,存在大量的重复的优化器开销。 |
Generic Plan | 每次执行可以省去重复的优化器解析的开销,SQL执行计划可以共享 | 缺点是当bind参数字段上数据存在倾斜时该计划可能不是最优的,部分bind参数场景下执行性能较差。 |
示例
use_cplan
MogDB=# create table t (a int, b int, c int);
CREATE TABLE
MogDB=# prepare p as select /*+ use_cplan */ * from t where a = $1;
PREPARE
MogDB=# explain execute p(1);
QUERY PLAN
----------------------------------------------------
Seq Scan on t (cost=0.00..34.31 rows=10 width=12)
Filter: (a = 1)
(2 rows)
MogDB=# show enable_pbe_optimization;
enable_pbe_optimization
-------------------------
on
(1 row)
use_gplan
MogDB=# deallocate p;
DEALLOCATE
MogDB=# prepare p as select /*+ use_gplan */ * from t where a = $1;
PREPARE
MogDB=# explain execute p(1);
QUERY PLAN
----------------------------------------------------
Seq Scan on t (cost=0.00..34.31 rows=10 width=12)
Filter: (a = $1)
(2 rows)
参考文档:
https://docs.mogdb.io/zh/mogdb/v5.0/hint-based-tuning#%E8%AF%AD%E6%B3%95%E6%A0%BC%E5%BC%8F-7
https://docs.mogdb.io/zh/mogdb/v5.0/other-optimizer-options#enable_pbe_optimization