基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
如何导出 OUTLINE 实现稳定的执行计划
更新时间:2024-12-19 08:41
在 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.sql表示需要执行 SQL 查询的文件,需先创建文件,并在里面写明查询的语句,用来获取 outline data。具体示例语句如下:select sql_id, query_sql,outline_data,AVG_EXE_USEC from gv$plan_cache_plan_stat where query_sql like 'xxxx%';$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.date +"%Y-%m-%d".log中。在需要绑定执行计划时,在 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 需要连接到正确的租户和数据库中执行。