outline执行计划绑定不生效

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.5
【问题描述】一个sql执行常态0.1秒左右,但是偶发的会飙升到几十甚至几百秒
查看gv$ob_sql_audit发现很多时间浪费在io_wait_sec,EVENT是px loop condition wait
±-----------------±-------------------------±------------±------------±----------±---------------------±------------±---------------±------------±-----------------------±-----------±---------+
| request_time | time_readable | elapsed_sec | execute_sec | queue_sec | concurrency_wait_sec | io_wait_sec | total_wait_sec | total_waits | event | wait_class | ret_code |
±-----------------±-------------------------±------------±------------±----------±---------------------±------------±---------------±------------±-----------------------±-----------±---------+
| 1774851843285139 | 2026-03-30 14:24:03.2851 | 420.6499 | 420.6498 | 0.0000 | 0.0000 | 0.0000 | 362.2064 | 390257 | px loop condition wait | NETWORK | 0 |

观察outline:
select * from oceanbase.gv$ob_plan_cache_plan_stat where sql_id = ‘5FDECA67241269355F36F7A4EB36AD00’ \G
得到:
OUTLINE_DATA: /+BEGIN_OUTLINE_DATA LEADING(@“SEL$618C9326” ((“TAB”@“SEL$1” “TABD”@“SEL$1”) “TR”@“SEL$1”)) USE_NL(@“SEL$618C9326” “TR”@“SEL$1”) PQ_DISTRIBUTE(@“SEL$618C9326” “TR”@“SEL$1” BC2HOST NONE) USE_HASH(@“SEL$618C9326” “TABD”@“SEL$1”) PQ_DISTRIBUTE(@“SEL$618C9326” “TABD”@“SEL$1” LOCAL LOCAL) INDEX(@“SEL$618C9326” “TAB”@“SEL$1” “UDX_ACCOUNT_ENTITY_NO”) INDEX(@“SEL$618C9326” “TABD”@“SEL$1” “IDX_CREATED_AT”) INDEX(@“SEL$618C9326” “TR”@“SEL$1” “IDX_RECEIPT_NO”) SIMPLIFY_GROUP_BY(@“SEL$1”) REPLACE_CONST(@“SEL$EA493D33”) OUTER_TO_INNER(@“SEL$44092447”) PRED_DEDUCE(@“SEL$79C92EA1”) OPTIMIZER_FEATURES_ENABLE(‘4.3.4.0’) DYNAMIC_SAMPLING(1) END_OUTLINE_DATA/
问了AI分析说是这2个是重点,发生了并行执行(暂且认为是真的)
PQ_DISTRIBUTE(@“SEL$618C9326” “TR”@“SEL$1” BC2HOST NONE)
BC2HOST Broadcast to Host - 广播分发
PQ_DISTRIBUTE(@“SEL$618C9326” “TABD”@“SEL$1” LOCAL LOCAL)
LOCAL - 本地分发

然后根据AI建议绑定hint /*+ PARALLEL(1) /:
CREATE OUTLINE disable_parallel_dba_1 ON ‘5FDECA67241269355F36F7A4EB36AD00’ USING hint /
+ PARALLEL(1) /;
CREATE FORMAT OUTLINE disable_parallel_dba_1 ON ‘CA87A7020C2392E604B07C1A25D87D43’ USING HINT /
+ PARALLEL(1) */;
绑定outline和format outline都试过了,绑完也刷新过缓存:ALTER SYSTEM FLUSH PLAN CACHE sql_id = ‘5FDECA67241269355F36F7A4EB36AD00’ GLOBAL;
但是查看gv$ob_plan_cache_plan_stat最后outline_id=-1一直没变,看上去就是没绑上去,请问为什么?以及AI分析的加parallel(1)是有道理的吗

3 个赞

找官方

select * from DBA_OB_OUTLINE where outline_name=’ disable_parallel_dba_1’;

obclient [BAOFU_CBA]> select * from oceanbase.DBA_OB_OUTLINES;
Empty set (0.004 sec)

obclient [BAOFU_CBA]> select * from oceanbase.DBA_OB_FORMAT_OUTLINES;
±---------------------------±---------------------------±----------±------------±-----------±--------------±-----------------------±------------------±----------------±---------------±------------±---------------------------------±------------------+
| CREATE_TIME | MODIFY_TIME | TENANT_ID | DATABASE_ID | OUTLINE_ID | DATABASE_NAME | OUTLINE_NAME | VISIBLE_SIGNATURE | FORMAT_SQL_TEXT | OUTLINE_TARGET | OUTLINE_SQL | FORMAT_SQL_ID | OUTLINE_CONTENT |
±---------------------------±---------------------------±----------±------------±-----------±--------------±-----------------------±------------------±----------------±---------------±------------±---------------------------------±------------------+
| 2026-03-31 10:18:31.553300 | 2026-03-31 10:18:31.553300 | 1008 | 500519 | 548257 | BAOFU_CBA | disable_parallel_dba_1 | | | | | CA87A7020C2392E604B07C1A25D87D43 | /*+PARALLEL(1) */ |
±---------------------------±---------------------------±----------±------------±-----------±--------------±-----------------------±------------------±----------------±---------------±------------±---------------------------------±------------------+

之前绑的普通outline,没生效,换成了format outline,虽然也是没生效

使用sql文本方法创建下试试
CREATE OUTLINE otl_idx_c2 ON SELECT/+ index(t1 idx_c2)/ * FROM t1 WHERE c2 = 1;

这个没看懂, ON 后面应该是我select * from oceanbase.gv$ob_plan_cache_plan_stat where sql_id = ‘5FDECA67241269355F36F7A4EB36AD00’ 里拿到的STATEMENT字段的值吧?是一个把具体参数替换成?的格式化过的sql,然后也没有加额外的我想要指定的hint的地方啊?比如用format_sql_id绑就有个很易懂的USING HINT /*+ PARALLEL(1) */;

现在的sql带了个hint: dynamic_sampling(1),不知道在后续额外绑定outline的时候会不会有冲突

SELECT sql_id, format_sql_id, outline_id
FROM oceanbase.gv$ob_plan_cache_plan_stat
WHERE sql_id = ‘5FDECA67241269355F36F7A4EB36AD00’;
需要确认 plan cache 中这条 SQL 的 format_sql_id 字段是否确实是 CA87A7020C2392E604B07C1A25D87D43

后续额外绑定outline需要带上原有的hint: dynamic_sampling(1)

好的,这次是开发改代码发布直接带上hint了,下次我再试试