openGauss/MogDB基于绑定变量的SQL优化
对于以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参数场景下执行性能较差。 |