---
title: "计划缓存概述 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: 计划缓存概述 OceanBase 数据库中存在大量的改写规则和复杂的计划生成算法，这些都为 OceanBase 数据库带来了强大的优化能力。然而任何事情都具有两面性，更多改写的尝试、更复杂的计划生成算法必然会使得计划的生成时间变得更久。在极端的 TP 场景下，一个主键单点查询的 SQL 可能生成计划花了 1ms，但是…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# 计划缓存概述

更新时间：2026-05-16 11:33:04

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/600.manage/900.performance-tuning/400.sql-tuning/200.execution-plan-optimization/200.plan-management/100.plan-cache-overview.md)  

OceanBase 数据库中存在大量的改写规则和复杂的计划生成算法，这些都为 OceanBase 数据库带来了强大的优化能力。然而任何事情都具有两面性，更多改写的尝试、更复杂的计划生成算法必然会使得计划的生成时间变得更久。在极端的 TP 场景下，一个主键单点查询的 SQL 可能生成计划花了 1ms，但是计划的执行只需要 0.5ms。在这种场景下，如果每条 SQL 执行时都要重新生成计划，那么 SQL 的主要耗时就会花在生成计划上了。因此 OceanBase 数据库引入了计划缓存（Plan Cache）机制供相同的 SQL 共享执行计划。

## 计划缓存

当 OceanBase 数据库收到一条 SQL 请求后，首先会通过 fast parser 模块对 SQL 文本做一次快速参数化。快速参数化的作用是把 SQL 文本中的常量参数替换成通配符 `?`，例如 `SELECT * FROM t1 WHERE c1 = 1` 会被替换为 `SELECT * FROM t1 WHERE c1 = ?`。接着数据库会从计划缓存中查看有没有已经生成好的计划给这条参数化后的 SQL 使用。如果找到了可用的计划，数据库就会直接执行这个计划。如果没有找到可用的计划，数据库会重新为这条 SQL 生成执行计划，并把生成好的计划保存到计划缓存中以备后续的 SQL 使用。通常情况下从计划缓存中直接获取执行计划相比于重新生成执行计划，耗时通常会低至少一个数量级，因此使用计划缓存可以大大降低获取执行计划的时间，从而减少 SQL 的响应时间。

![计划缓存](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V4.2.1/manage/plan-manage.png)

## 自适应计划缓存

OceanBase 数据库 Plan Cache 功能是默认开启的，在 AP 场景下关闭 Plan Cache 往往可以获得更好的性能。但是在 HTAP 混合负载的业务场景中，关闭 Plan Cache 虽然可以让偏 AP 的 SQL 获得更好的性能，但是也会让偏 TP 的 SQL 受到极大的影响。因此，OceanBase 数据库在 V4.3.5 BP2 版本支持了 Plan Cache 的自适应开启能力，为 TP 的 SQL 开启 Plan Cache，为 AP 的 SQL 关闭 Plan Cache，以获得整体更优的性能。

### 自适应计划缓存控制

OceanBase 数据库在 V4.3.5 BP2 版本新增自适应计划缓存相关配置项：

- `enable_adaptive_plan_cache`：租户级配置项，用于控制租户是否开启计划缓存自适应的能力。详细介绍信息，参见 [enable_adaptive_plan_cache](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685406)。
 - `_pc_adaptive_min_exec_time_threshold`：租户级隐藏配置项，该配置项用于控制启用自适应计划缓存的最小执行时间阈值，即在自适应计划缓存功能开启的情况下，执行时间超过该阈值的 SQL 才开启自适应计划缓存。属性说明如下：

  | **属性** | **描述** |
  | --- | --- |
  | 参数类型 | TIME |
  | 默认值 | 1s |
  | 取值范围 | [0, +∞] |
  | 是否可修改 | 是，支持通过 `ALTER SYSTEM SET` 语句修改该配置项的值。例如：`ALTER SYSTEM SET _pc_adaptive_min_exec_time_threshold = '2s';`。   #### 说明    Oracle 模式下，在语法上隐藏配置项需加双引号。 |
  | 是否重启 OBServer 节点生效 | 否，设置后立即生效。 |
 - `_pc_adaptive_effectiveness_ratio_threshold`：租户级隐藏配置项，该配置项用于控制启用自适应计划缓存的最小比率阈值，即在自适应计划缓存功能开启的情况下，计划执行时间/计划生成时间 大于等于该阈值才开启自适应计划缓存。属性说明如下：

  | **属性** | **描述** |
  | --- | --- |
  | 参数类型 | INT |
  | 默认值 | 5 |
  | 取值范围 | [0, +∞] |
  | 是否可修改 | 是，支持通过 `ALTER SYSTEM SET` 语句修改该配置项的值。例如：`ALTER SYSTEM SET _pc_adaptive_effectiveness_ratio_threshold = 6;`。   #### 说明    Oracle 模式下，在语法上隐藏配置项需加双引号。 |
  | 是否重启 OBServer 节点生效 | 否，设置后立即生效。 |
 - `_force_enable_plan_tracing`：租户级隐藏配置项，该配置项用于控制在禁用计划缓存时是否启用计划跟踪。属性说明如下：

  | **属性** | **描述** |
  | --- | --- |
  | 参数类型 | BOOL |
  | 默认值 | TRUE，表示在禁用计划缓存时启用计划跟踪。 |
  | 取值范围 | - TRUE   - FALSE |
  | 是否可修改 | 是，支持通过 `ALTER SYSTEM SET` 语句修改该配置项的值。例如：`ALTER SYSTEM SET _force_enable_plan_tracing = FALSE;`。   #### 说明    Oracle 模式下，在语法上隐藏配置项需加双引号。 |
  | 是否重启 OBServer 节点生效 | 否，设置后立即生效。 |

自适应 Plan Cache 开启的情况下，一条 SQL 执行结束之后根据执行反馈同时满足以下三点就判定为需要对该 SQL 关闭 Plan Cache：

- SQL 执行时间超过隐藏配置项 `_pc_adaptive_min_exec_time_threshold` 设置的阈值。
 - SQL 执行时间/计划生成时间，超过隐藏配置项 `_pc_adaptive_effectiveness_ratio_threshold` 设置的阈值。
 - 多次执行，连续五次都满足上述两个条件。

 上一篇 下一篇 ![有帮助](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) 咨询热线
