在 OceanBase 数据库进行版本升级、合并、Schema 版本变化或参数微调后,可能会影响执行计划的生成。在这些情况下,往往需要通过 OUTLINE 对某些 SQL 绑定执行计划。本文介绍如何导出 OUTLINE。
适用版本
OceanBase 数据库所有版本
影响执行计划的因素
在 OceanBase 数据库进行版本升级、合并、Schema 版本变化或参数微调后,可能会影响执行计划的生成。在这些情况下,往往需要通过 OUTLINE 对某些 SQL 绑定执行计划。
OceanBase 数据库中
gv$plan_cache_plan_stat
视图的
outline_data
列记录了执行计划对应的 OUTLINE 信息,但该表会在合并时触发淘汰机制,其中缓存的
plan_id
会被删除。并且
plan_id
是 OBServer 启动后通过一个本地范围内的自增序列产生的值,OBServer 重启后,
plan_id
会重置。因此,不能通过
plan_id
确定执行计划的稳定性。
综上所述,可以通过在 OceanBase 数据库能够稳定生成某条 SQL 执行计划的时机导出 OUTLINE,并在后续的执行中绑定给 SQL,实现执行计划的稳定。
导出 OUTLINE
-
在 OceanBase 数据库能够稳定生成某条 SQL 执行计划时,通过以下命令导出 OUTLINE。
-
其中,
$IP
表示连接 OceanBase 数据库的 IP 地址,
$PORT
表示连接端口,
$cluster_name
表示集群名称,
$name
表示输出的文件名。
[admin@hostname ~]$ obclient -h$IP -P$PORT -uroot@sys#$cluster_name -p -c -v -f -c <$name.sql |tee $name.`date +"%Y-%m-%d"`.log
-
执行上述命令后,结果会打印到
$name.sql
中。
-
在需要绑定执行计划时,在 OBClient 中执行以下语句即可实现 OUTLINE 的绑定。
obclient> CREATE OUTLINE obcoe_647EF62257D0957DE5AA5D192AE83818 on “647EF62257D0957DE5AA5D192AE83818” using hint /*+ BEGIN_OUTLINE_DATA INDEX(@“SEL$1” “SYS.T1”@“SEL$1” “IDX_C2”) END_OUTLINE_DATA*/; obclient> CREATE OUTLINE obcoe_3E366BE221C0E003DB69CF55E629A7C6 on “3E366BE221C0E003DB69CF55E629A7C6” using hint /*+ BEGIN_OUTLINE_DATA END_OUTLINE_DATA*/;
- 注意绑定 OUTLINE 需要连接到正确的租户和数据库中执行。