
# 使用指导
现网环境下，对存在缓存计划问题的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);
```
具体的选择原因如下：
表1计划选择原因 
| 选择原因                       | 说明                                            |
|:---|:---|
| 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             | 选择多版本计划。                                      |
   
