更新时间:2026-07-28 GMT+08:00
分享

使用指导

现网环境下,对存在缓存计划问题的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

选择多版本计划。

相关文档