使用指导
现网环境下,对存在缓存计划问题的query可使用hint开启计划自适应管理能力:
SELECT /*+ choose_adaptive_gplan */ * FROM tab WHERE c1 = xxx;
上述hint为可选,仅用于优先倾向生成aplan。不加hint时,只要满足条件(即enable_cachedplan_mgr = on且查询类型、执行次数等条件符合),aplan同样生效。
JDBC客户端默认会将以上带hint的SQL转换为PBE模型,并建立查询模板。除直接修改SQL外,hint还可通过sqlpatch能力进行添加。
gsql环境下,可以使用手动创建查询模板的模式进行:
PREPARE test_stmt AS SELECT /*+ choose_adaptive_gplan */ * FROM tab WHERE c1 = $1;
使用explain(adaptcost) 可以查看当前使用的计划类型(cplan/gplan/aplan)和选择该计划的原因:
PREPARE k AS SELECT * FROM t1 WHERE c1=$1 AND c2=$2; EXPLAIN (adaptcost) EXECUTE k(1,2);
具体的选择原因如下:
| 选择原因 | 说明 |
|---|---|
| SHARED_PLANCACHE | GPC共享的计划。 |
| UPSERT_UPDATE_QUERY | upsert语句的参数位于update子句中。 |
| PBE_OPT_AND_MOT_ENGINE | 使用了pbe优化和mot引擎。 |
| PARAM_EXPR | 包含limit限制的delete查询。 |
| ONE_SHOT_PLAN | 一次性计划。 |
| NO_BOUND_PARAM | 计划没有绑定参数。 |
| TRANSACTION_STAT | 事务控制语句。 |
| CALLER_FORCE_GPLAN | 上层调用指定使用gplan。 |
| CALLER_FORCE_CPLAN | 上层调用指定使用cplan。 |
| CHOOSE_BY_HINT | 根据hint来选择。 |
| PBE_OPTIMIZATION | 开启pbe优化。 |
| SETTING_FORCE_GPLAN | plan_cache_mode设置使用gplan。 |
| SETTING_FORCE_CPLAN | plan_cache_mode设置使用cplan。 |
| TRY_CPLAN | 生成计划前5次尝试使用cplan。 |
| COST_PREFER_GPLAN | 比较5次cplan平均和gplan的代价,gplan的代价比cplan低。 |
| WHERE_CURRENT_CURSOR_QUERY | 条件带引用参数表达式(CurrentOfExpr)的delete/update查询。 |
| DEFAULT_CHOOSE | 默认选择。 |
| WISE_CHOOSE_CPLAN | 选择gplan/aplan后若该计划代价大于cplan代价的5倍,将计划纠正为cplan。 |
| NOT_SELECT_QUERY | 非select型语句直接走gplan。 |
| TOO_FEW_CPLAN | cplan探测次数小于5次,走cplan。 |
| TOO_FEW_GPLAN | cplan探测次数已满5次,如果gplan没有探测过,选择gplan。 |
| BY_MONITOR_FEEDBACK | 根据反馈信息来选择最优计划,反馈类型为MONITOR。 |
| BY_NORMAL_FEEDBACK | 根据反馈信息来选择最优计划,反馈类型为NORMAL。 |
| TRY_MULTI_PLAN | 选择多版本计划。 |