对于开启 SPM 功能的租户,随着业务变更、动态查询等原因可能保留了大量已经不再使用的基线,这些基线的数量会随着时间积累而增长。 OceanBase 能够自动定期清理这些基线,并对不再使用基线保留的时间进行设置。
详细说明
对于开启 SPM 功能的租户,数据库中执行过的查询会自动添加基线(在 V4.2.5 BP4、V4.3.5 BP4、V4.4.1 及之后的版本,计划在 plan cache 中保留且执行超过 150 次会添加基线,这些版本之前的版本,计划成功执行一次就会添加基线)。 如果业务存在频繁变更、存在大量动态查询等情况,数据库中会保留了大量已经不再使用的基线,这些基线的数量会随着时间积累而增长。 为了避免大量不再使用的基线占用磁盘空间、对 SPM 功能正常执行造成影响,OceanBase 实现了自动基线清理功能,每天凌晨 1:00 执行定时任务,调用 DBMS_SPM.AUTO_PURGE_SQL_PLAN_BASELINE 对长时间不再使用基线进行清理。 基线保留时间可以通过以下方式进行查询和配置,早期版本默认保留一年时间的基线(即 53 周),较新版本将这一默认值调整为了 7 周,从低版本升级的版本仍保留原始设置,升级后可以根据需要进行配置。建议保留基线时间在一个月以上,避免月结、跑批等查询等基线被清理。
-- oracle 模式设置及查询基线保留时间
call DBMS_SPM.CONFIGURE('plan_retention_weeks', 5);
select * from sys.DBA_SQL_MANAGEMENT_CONFIG where PARAMETER_NAME = 'PLAN_RETENTION_WEEKS';
+----------------------+-----------------+----------------------------+-------------+
| PARAMETER_NAME | PARAMETER_VALUE | LAST_MODIFIED | MODIFIED_BY |
+----------------------+-----------------+----------------------------+-------------+
| PLAN_RETENTION_WEEKS | 5 | 2025-09-19 11:12:40.231801 | TEST |
+----------------------+-----------------+----------------------------+-------------+
-- MySQL 模式设置及查询基线保留时间
call DBMS_SPM.CONFIGURE('test', 'plan_retention_weeks', 5);
select * from oceanbase.DBA_SQL_MANAGEMENT_CONFIG where PARAMETER_NAME = 'PLAN_RETENTION_WEEKS';
+----------------------+-----------------+----------------------------+-------------+
| PARAMETER_NAME | PARAMETER_VALUE | LAST_MODIFIED | MODIFIED_BY |
+----------------------+-----------------+----------------------------+-------------+
| PLAN_RETENTION_WEEKS | 5 | 2025-09-19 11:12:20.539905 | test |
+----------------------+-----------------+----------------------------+-------------+
V4.2.1 版本在 V4.2.1 BP11 Hotfix10 之后具备基线自动清理功能,但从低版本升级到 V4.2.1 BP11 Hotfix10 的租户,需要进行以下操作进行检查。
检查并确认是否存在相关系统包,如果不存在,需要手动升级系统包。
-- 执行以下查询,如果执行报错 FUNCTION DBMS_SPM.AUTO_PURGE_SQL_PLAN_BASELINE does not exist, 先确认 421 版本是否支持,如果版本已经支持,需要手动升级系统包 select DBMS_SPM.AUTO_PURGE_SQL_PLAN_BASELINE() from dual; -- 手动升级系统包,直连到集群中某个server,系统租户下执行如下命令 alter system set enable_upgrade_mode =true; set ob_compatibility_mode='oracle'; set ob_query_timeout = 300000000; CALL "__DBMS_UPGRADE".UPGRADE_ALL(); set ob_compatibility_mode='mysql'; alter system set enable_upgrade_mode = false;检查是否存在清理基线的定时任务,如果不存在,需要手动创建定时任务。
Oracle 模式下,在业务租户租户下创建定时任务(维护窗口):
-- 查看创建的定时任务 select * from DBA_SCHEDULER_JOBS where JOB_NAME = 'SPM_STATS_MANAGER'\G BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'SPM_STATS_MANAGER', job_type => 'STORED_PROCEDURE', job_action => 'DBMS_SPM.HANDLE_SPM_STATS_JOB_PROC()', start_date => '2025-09-20 01:00:00.000000', -- 设置为次日 1:00,创建时需要调整该值 repeat_interval => 'FREQ=DAYLY; INTERVAL=1', end_date => '4000-01-01 00:00:00.000000', enabled => true, auto_drop => false, comments => 'used to handle spm stats', max_run_duration => 3600); END; /MySQL 模式下,在系统租户下,为业务租户创建定时任务(维护窗口):
-- 在 sys 租户下切换操作业务租户的内部表 alter system change tenant tenant_id = 1004; -- 确认以下查询结果为空,即不存在 SPM_STATS_MANAGER job select * from __all_tenant_scheduler_job where job_name = "SPM_STATS_MANAGER"\G -- 获取需要添加的 job 号 select max(job) + 1 into @next_job from __all_tenant_scheduler_job; -- 设置 job 开始时间, 后续每天这个时刻自动执行任务 set @start_time = '2025-09-25 01:00:00'; -- 设置为次日 1:00, 创建时需要调整该值 -- 在内部表创建 job INSERT INTO __all_tenant_scheduler_job( tenant_id, job_name, job, lowner, powner, cowner, next_date,total,`interval#`,flag,what,nlsenv,field1,exec_env,job_style,program_name,job_type,job_action,number_of_argument,start_date,repeat_interval,end_date,job_class,enabled,auto_drop,comments,credential_name,destination_name,interval_ts,max_run_duration) VALUES (0, "SPM_STATS_MANAGER", @next_job, "root@%", "root@%", "oceanbase", @start_time, 0, "FREQ=DAYLY; INTERVAL=1", 0, "DBMS_SPM.HANDLE_SPM_STATS_JOB_PROC()", "", "", "281018368,45,45,45,2,", "REGULER", "", "STORED_PROCEDURE", "DBMS_SPM.HANDLE_SPM_STATS_JOB_PROC()", 0, @start_time, "FREQ=DAYLY; INTERVAL=1", usec_to_time(64060560000000000), "DEFAULT_JOB_CLASS", 1, 0, "used to handle spm stats", "", "", 86400000000, 3600), (0, "SPM_STATS_MANAGER", 0, "root@%", "root@%", "oceanbase", @start_time, 0, "FREQ=DAYLY; INTERVAL=1", 0, "DBMS_SPM.HANDLE_SPM_STATS_JOB_PROC()", "", "", "281018368,45,45,45,2,", "REGULER", "", "STORED_PROCEDURE", "DBMS_SPM.HANDLE_SPM_STATS_JOB_PROC()", 0, @start_time, "FREQ=DAYLY; INTERVAL=1", usec_to_time(64060560000000000), "DEFAULT_JOB_CLASS", 1, 0, "used to handle spm stats", "", "", 86400000000, 3600);
适用版本
OceanBase 数据库 V4.2.1 BP11 Hotfix10(oceanbase-4.2.1.11-111100012025092309)及之后版本、V4.2.5 BP4(oceanbase-4.2.5.4-104000082025052817)及之后版本、V4.3.5 BP2 Hotfix9(oceanbase-4.3.5.2-102090012025082611)及之后版本、V4.3.5 BP3 Hotfix2(oceanbase-4.3.5.3-103020012025082017)及之后版本、V4.3.5 BP4(oceanbase-4.3.5.4-104000052025090918)及之后版本、V4.4.1(oceanbase-4.4.1.0-100000242025092415)及之后版本。