暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 许玉晨 2024-02-22
92

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论