openGauss/MogDB基于绑定变量的SQL优化

2024年 2月 22日 20.3k 0

对于以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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论