---
title: 如何手动删除 SPM 基线-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 如何手动删除 SPM 基线相关的常见问题和使用技巧，帮助您快速解决 如何手动删除 SPM 基线的难题。
---
切换语言

- 简体中文
- English

划线反馈

# 如何手动删除 SPM 基线

更新时间：2026-05-15 09:06

适用版本： V4.0.x、V4.1.x、V4.2.x、V4.3.x、V4.4.x 内容类型：How-to  

当 SPM 开启后，SPM 早期版本存在着基线策略/演进策略不优，导致一些差的计划生成，并保存在 SPM 中。 SQL 执行过程中，会分配一定的流量给基线中的计划，导致差的 SPM 计划被应用，从而引发 SQL 执行慢的问题。同时旧的版本，没有自动清理 SPM 的功能，会存在一些低频 SQL 存在 SPM 基线的情况下，需要手动删除基线。

## 详细说明

下面介绍删除单条基线和批量删除基线的方式。

### 查看删除单条基线

- 查看对应的 SQL 是否在 SPM 基线中。

  ```sql
  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 中是否存在计划。

  ```sql
  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 租户：

      ```sql
      ALTER SYSTEM FLUSH PLAN CACHE sql_id='794B59B3751CD0C8D66xxx' databases='dbxx' tenant='tenant_idxxx' GLOBAL;

      ```
     - Oracle 租户：

      ```sql
      begin
      DBMS_PLAN_CACHE.PURGE (
      sql_id       =>    '794B59B3751CD0C8D66xxx',
      schema   =>    'SYS',
      global   =>      TRUE);
      end;
      /

      ```
 - 删除基线。

  `DROP_SQL_PLAN_BASELINE` 函数用于丢弃一个或多个计划基线：

  ```sql
  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 所有正在演进的计划。 |

示例如下：

```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](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001502822) 。

```sql
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 语句单独开启事务：

```sql
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 版本。

Previous

[内部表查询 SQL 优化](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002395190)

Next

[如何使用 Wireshark 追踪链路 SQL 执行](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002393951) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
