首批通过分布式安全可靠测评,为关键业务系统打造
如何手动删除 SPM 基线
更新时间:2026-05-15 09:06
当 SPM 开启后,SPM 早期版本存在着基线策略/演进策略不优,导致一些差的计划生成,并保存在 SPM 中。 SQL 执行过程中,会分配一定的流量给基线中的计划,导致差的 SPM 计划被应用,从而引发 SQL 执行慢的问题。同时旧的版本,没有自动清理 SPM 的功能,会存在一些低频 SQL 存在 SPM 基线的情况下,需要手动删除基线。
详细说明
下面介绍删除单条基线和批量删除基线的方式。
查看删除单条基线
查看对应的 SQL 是否在 SPM 基线中。
select tenant_id, database_id, plan_hash_value, gmt_create, gmt_modified, plan_type, origin, usec_to_time(last_executed), usec_to_time(last_verified), elapsed_time, cpu_time, executions from __all_virtual_plan_baseline_item where tenant_id = 100x and sql_id ='794B59B3751CD0C8D66xxx';查看对应的 SQL 在 Plan Cache 中是否存在计划。
select PLAN_ID,PLAN_HASH,SQL_ID,STATEMENT,LAST_ACTIVE_TIME,HIT_COUNT,OUTLINE_DATA from oceanbase.GV$OB_PLAN_CACHE_PLAN_STAT where sql_id='794B59B3751CD0C8D66xxx';删除计划缓存。
sys 租户/MySQL 租户:
ALTER SYSTEM FLUSH PLAN CACHE sql_id='794B59B3751CD0C8D66xxx' databases='dbxx' tenant='tenant_idxxx' GLOBAL;Oracle 租户:
begin DBMS_PLAN_CACHE.PURGE ( sql_id => '794B59B3751CD0C8D66xxx', schema => 'SYS', global => TRUE); end; /
删除基线。
DROP_SQL_PLAN_BASELINE函数用于丢弃一个或多个计划基线:DBMS_SPM.DROP_SQL_PLAN_BASELINE ( sql_handle IN VARCHAR2, plan_name IN VARCHAR2 := NULL ) RETURN PLS_INTEGER;
参数说明
| 参数名称 | 说明 |
|---|---|
| database_name | 数据库名称,仅 MySQL 模式下需要指定该参数。 |
| sql_handle | SQL 的标识符,也就是 SQL_ID |
| plan_name | 计划的名称,也就是 Plan Hash Value。如果值为 NULL,表示接受一个 SQL 所有正在演进的计划。 |
示例如下:
select DBMS_SPM.DROP_SQL_PLAN_BASELINE('dbxx','794B59B3751CD0C8D66xxx','plan_idxxxx') from dual;
批量删除基线
从 OceanBase 数据库 V4.2.5 BP2 开始,支持调用 DBMS_SPM.BATCH_DROP_SQL_PLAN_BASELINE() 删除当前租户的所有计划基线。详情参见:BATCH_DROP_SQL_PLAN_BASELINE 。
call BATCH_DROP_SQL_PLAN_BASELINE();
BATCH_DROP_SQL_PLAN_BASELINE需要在 SPM 关闭时调用。如果批量删除 Baseline 时,仍有计划正在演进,在 Baseline 删除完成后,成功演进的计划仍可能添加到基线中。BATCH_DROP_SQL_PLAN_BASELINE后,触发内部 SQL 删除__all_plan_baseline和__all_plan_baseline_item中的数据。当部分 Delete 执行失败时,BATCH_DROP_SQL_PLAN_BASELINE执行失败,此时两张内部表数据处于异常状态。
为避免存在大量 Baseline 时删除失败,使用如下两条 Delete 按 1W 行逐批删除,每条 Delete 语句单独开启事务:
DELETE FROM __all_plan_baseline WHERE tenant_id = 0 limit 10000;
DELETE FROM __all_plan_baseline_item WHERE tenant_id = 0 limit 10000;
警告
删除 __all_plan_baseline 和 __all_plan_baseline_item 的 Baseline 有一定的风险,请勿在生产库上自行删除,请联系咨询 OceanBase 技术支持团队获得帮助。
适用版本
OceanBase 数据库 V4.x 版本。