如何导出 OUTLINE 实现稳定的执行计划?

在 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

  1. 在 OceanBase 数据库能够稳定生成某条 SQL 执行计划时,通过以下命令导出 OUTLINE。

  2. 其中,

    $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

  1. 执行上述命令后,结果会打印到

    $name.sql

    中。

  2. 在需要绑定执行计划时,在 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*/;

  1. 注意绑定 OUTLINE 需要连接到正确的租户和数据库中执行。
1 个赞

很实用。特别是线上数据迁移后担心执行计划不稳定时有用。


欢迎使用反馈和分享,我们也可以根据你的反馈改进文档。


下面总结也可以参考:


https://mp.weixin.qq.com/s/j4hn2u7xfe91CB9pdygp6Q

您好,请问:

1:$name.sql 文件内容是什么?

2:“结果会打印到 $name.sql 中”还是tee $name.

date +"%Y-%m-%d"
 .log --此处是把执行内容输出到 当前日期的一个log文件中呀?

如何有效使用 outline 功能?

为了防止某些 SQL 的执行计划发生变化,我们通常会创建 outline 来绑定执行计划。但是为什么实际过程中,我们创建 outline 并验证时总会遇到不生效的情况?

阅读本文你将了解:

  1. 如何获取 SQL ID
  2. 如何创建 outline
  3. 如何正确验证 outline 效果