---
title: "窗口合并 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: 窗口合并 窗口合并（Window Compaction）是 OceanBase 数据库引入的一种全新的合并形式，它由系统在指定的时间窗口内自动调度执行。窗口合并主要适用于分区数量巨大、增量数据分布不均、业务有明显高峰期低谷期，且需要精细化控制合并资源避免影响业务性能的场景。 对于 V4.6.x 版本，OceanBas…
---
切换语言

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

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

# 窗口合并

更新时间：2026-05-22 08:17:25

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/700.reference/200.system-management/500.manage-data-storage/200.merge-management/310.window-compaction.md)  

窗口合并（Window Compaction）是 OceanBase 数据库引入的一种全新的合并形式，它由系统在指定的时间窗口内自动调度执行。窗口合并主要适用于分区数量巨大、增量数据分布不均、业务有明显高峰期低谷期，且需要精细化控制合并资源避免影响业务性能的场景。

对于 V4.6.x 版本，OceanBase 数据库从 V4.6.0 版本开始支持窗口合并。相较于现有的租户合并，窗口合并不会对所有的表都发起合并，而是按需地对有增量数据或者满足特定合并条件的分区发起合并。窗口合并的合并任务仅在指定的时间段内发起。达到预设的执行时长后，系统将自动切换回常规的自适应合并模式，从而保证了合并时间与资源占用的可控性。

更进一步地，在开启了 cgroup 的 OceanBase 集群中，OceanBase 数据库允许用户为窗口合并配置专门的资源计划，给合并窗口期的合并任务分配更多的 CPU/IO 资源，充分利用空闲时间进行数据整理工作。

## 背景信息

窗口合并本质上调度的是分区级合并。在窗口合并期间，系统会收集各个分区的统计信息，并对每个分区进行评分。相关的评分因子包括：

- 增量行数 (inc_row_cnt)
 - 距离上次合并的天数
 - 表的查询频率（热度）
 - SSTable 数量

进行窗口合并调度时，系统会尽量按从高优先级到低优先级的顺序调度，并按批次调度，限制租户内最多未执行的合并任务的数量，从而让合并任务的数量和结束时间可控。

## 使用限制及注意事项

- 窗口合并不支持主表和索引表的数据校验。
 - 同一时间内，租户合并与窗口合并只能存在一个，并且租户合并可以打断窗口合并，但是租户合并执行期间不能调度窗口合并。
 - 窗口合并期间，如果将配置项 [enable_window_compaction](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685458) 的值修改为 `False`（`enable_window_compaction = False`），则窗口合并会立即停止。
 - 租户合并期间，如果将配置项 [enable_window_compaction](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685458) 的值修改为 `True`（`enable_window_compaction = True`），则窗口合并的发起需要等待每日合并执行结束。
 - 窗口合并期间，不能通过 `ALTER SYSTEM SET` 语句修改租户级配置项 [compaction_low_thread_score](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685457) 的值，否则系统会报错。如果需要调整窗口合并的线程数，使用 `DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT()` 进行设置。

## 前提条件

- 触发合并前，需要确保全局合并开关已开启，全局合并开关由集群级配置项 [enable_major_freeze](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685471) 控制，默认值为 `True`，表示开启合并开关。

  如果当前集群未开启全局合并开关，请参考以下操作开启全局合并开关。

     1. 使用 `root` 用户登录集群的 `sys` 租户。
     2. 确认全局合并开关是否已开启。

       ```shell
       obclient(root@sys)[(none)]> SHOW PARAMETERS LIKE 'enable_major_freeze';

       ```
     3. 如果显示未开启，执行以下语句，开启合并开关。

       ```shell
       obclient(root@sys)[(none)]> ALTER SYSTEM SET enable_major_freeze='True';

       ```
 - 如果需要触发窗口合并，需要确保租户级配置项 [enable_window_compaction](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685458) 为 `True`，即开启窗口合并。

  具体操作如下：

     1. 租户管理员登录集群的 MySQL 租户或 Oracle 租户。
     2. 确认租户级配置项 `enable_window_compaction` 的值。

       ```shell
       obclient> SHOW PARAMETERS LIKE 'enable_window_compaction';

       ```
     3. 如果值为 `False`，执行以下语句，开启窗口合并。

       ```shell
       obclient> ALTER SYSTEM SET enable_window_compaction = True;

       ```

       系统租户下，可以通过指定租户名的方式进行设置，例如：`ALTER SYSTEM SET enable_window_compaction = True TENANT = tenant_name;`。

## 配置周期性触发窗口合并

类似于每日统计信息的收集，对于当前版本的每个用户租户，都在定时任务调度器 `DBMS_SCHEDULER` 中注册了 `DAILY_MAINTENANCE_WINDOW` 任务，用户可以根据业务需要，灵活定义窗口合并任务的开启或关闭、触发时间、执行时长等。

### 启用窗口合并任务

触发窗口合并需要用户手动启用窗口合并任务。

1. 租户管理员登录集群的 MySQL 租户或 Oracle 租户。

   连接示例如下，连接数据库时以实际环境为准。

   ```shell
   obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A

   ```
 2. 调用 `DBMS_SCHEDULER` 系统包的 `ENABLE` 子程序，启用窗口合并。

   MySQL 模式与 Oracle 模式下的执行语句相同，示例如下：

   ```shell
   obclient> CALL DBMS_SCHEDULER.ENABLE('DAILY_MAINTENANCE_WINDOW');

   ```

启用窗口合并任务后，默认窗口合并的开始时间为凌晨 `02:00`，持续时间为 6 小时，周期为每天。

### 修改窗口合并任务下次开始的时间

启用窗口合并任务后，默认下次窗口合并任务的执行开始时间为凌晨 `02:00`，用户可以根据业务需要，配置窗口合并任务下次开始的时间。

#### 注意

窗口合并默认一天一次，如果修改了下次执行的时间，例如，修改为凌晨 `01:00`，则之后为每天凌晨 ` 01:00` 执行窗口合并，而不再是凌晨 ` 02:00`。

   ```
 2. 调用 `DBMS_SCHEDULER` 系统包的 `SET_ATTRIBUTE` 子程序，设置窗口合并任务下次开始的时间。

   语句如下：

   ```sql
   CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW','NEXT_DATE', 'next_time');

   ```

   语句中，`next_time` 用于指定窗口合并任务下次开始的时间。

   示例如下：

       MySQL 模式   Oracle 模式

   例如，MySQL 模式模式下，设置窗口合并下次开始的时间为 `2026-03-10 01:00:00`。

   ```shell
   obclient(root@mysql001)[(none)]> CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'NEXT_DATE', '2026-03-10 01:00:00');

   ```

   Oracle 模式下，设置窗口合并下次开始的时间为 `2026-03-10 01:00:00`。

   ```shell
   obclient(SYS@oracle001)[SYS]> CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'NEXT_DATE', '10-MAR-2026 01:00:00 AM');

   ```

### 配置窗口合并任务的时长

启用窗口合并任务后，默认窗口合并任务的执行时长为 6 小时，用户可以根据业务需要，适当调整执行时长。

   ```
 2. 调用 `DBMS_SCHEDULER` 系统包的 `SET_ATTRIBUTE` 子程序，设置窗口合并任务的执行时长。

   语句如下：

   ```sql
   CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'DURATION', duration);

   ```

   语句中，`duration` 用于指定窗口合并任务的执行时长，单位为秒。

   #### 注意

      - 修改当前任务的执行时长会影响正在执行的任务本身。例如，调小 `duration` 的值将会导致当前正在执行的窗口合并任务提前结束。
      - 由于窗口合并每天调度一次，要求 `duration` 的值需要设置为小于 24 小时（86400）。  

   例如，设置窗口合并任务的时长为 10 小时，即 36000 秒。MySQL 模式与 Oracle 模式下的执行语句相同，示例如下：

   ```shell
   obclient> CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'DURATION', 36000);

   ```

## 调整窗口合并的线程数

窗口合并期间，其合并线程数不受租户级配置项 [compaction_low_thread_score](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685457) 控制，而是由 `DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT` 子程序中的 `thread_count` 控制，其默认值为 `0`，表示由系统按照租户相关配置自适应计算合并线程数。用户也可以根据业务需要，调整窗口合并的线程数。

   ```
 2. 调用 `DBMS_DAILY_MAINTENANCE` 系统包的 `SET_THREAD_COUNT` 子程序，设置窗口合并专用的合并线程数。

   语句如下：

   ```sql
   DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT(thread_count);

   ```

   例如，设置窗口合并的后台合并线程 COMPACTION_LOW 的线程数为 8。MySQL 模式与 Oracle 模式下的执行语句相同，示例如下：

   ```shell
   obclient> CALL DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT(8);

   ```

## （可选）配置窗口合并的资源管理计划

在开启了 cgroup 的集群上，窗口合并支持在合并期间切换到特定的资源管理计划，从而给合并任务提供更多的合并资源，让合并能够更快地执行，并覆盖充分多的分区，以确保业务高峰期时对分区操作的效率。

1. 租户管理员登录集群的 MySQL 租户或 Oracle 租户。
 2. 调用 `DBMS_RESOURCE_MANAGER` 系统包中的 `CREATE_CONSUMER_GROUP` 子程序，创建窗口合并专用资源组。

   #### 注意

   窗口合并的资源租名称 `INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP` 为固定名称，不能随意变更。

   ```shell
   obclient> CALL DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
     CONSUMER_GROUP => 'INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP',
     COMMENT => 'consumer group for daily window maintenance job'
   );

   ```
 3. 调用 `DBMS_RESOURCE_MANAGER` 系统包中的 `CREATE_PLAN` 子程序，创建窗口合并专用资源计划。

   #### 注意

   窗口合并的资源管理计划名称 `INNER_DAILY_WINDOW_PLAN` 为固定名称，不能随意变更。

   ```shell
   obclient> CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN(
     PLAN => 'INNER_DAILY_WINDOW_PLAN',
     COMMENT => 'plan for daily window maintenance job'
   );

   ```
 4. 调用 `DBMS_RESOURCE_MANAGER` 系统包中的 `CREATE_PLAN_DIRECTIVE` 子程序，创建资源管理计划对应的资源管理计划内容。

   ```shell
   obclient> CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
     PLAN => 'INNER_DAILY_WINDOW_PLAN',
     GROUP_OR_SUBPLAN => 'INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP',
     COMMENT => 'directive for window compaction',
     MAX_IOPS => 100,
     MIN_IOPS => 30,
     WEIGHT_IOPS => 50,
     UTILIZATION_LIMIT => 100,
     MGMT_P1 => 70
   );

   ```

配置成功后，当窗口合并任务开始执行时，系统会自动将当前的资源管理计划切换为窗口合并专用的资源计划 `INNER_DAILY_WINDOW_PLAN`，并将当前 COMPACTION_LOW 的 Function 线程（后台合并任务线程）的资源映射到窗口合并专用资源组 `INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP` 上。

#### 注意

配置窗口合并的资源管理计划后，在窗口合并期间，需要注意以下事项：

- 不能删除窗口合并专用的资源计划 `INNER_DAILY_WINDOW_PLAN` 和窗口合并专用资源组 `INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP`。
 - 不能修改该租户下的所有资源管理计划。

## 手动触发窗口合并

启用窗口合并任务后，如果还未到窗口合并任务指定的执行时间，用户可以根据业务需要，手动触发窗口合并。

#### 注意

- 仅允许用户租户手动触发窗口合并，系统租户（`sys` 租户）不支持手动触发窗口合并。
 - 手动触发窗口合并的语句执行成功后，如果该时间内仍存在未完成的租户合并，则窗口合并将无法发起。
 - 手动触发的窗口合并任务的执行时长同样受 `DBMS_SCHEDULER.SET_ATTRIBUTE` 子程序中窗口合并任务（DAILY_MAINTENANCE_WINDOW）的 `duration` 参数的控制，具体配置参见本文 **配置窗口合并任务的时长**。

1. 租户管理员登录集群对应的 MySQL 租户或 Oracle 租户。

   ```
 2. 调用 `DBMS_DAILY_MAINTENANCE` 系统包的 `TRIGGER_WINDOW_COMPACTION_PROC` 子程序，手动触发一次窗口合并。

   ```shell
   obclient> CALL DBMS_DAILY_MAINTENANCE.TRIGGER_WINDOW_COMPACTION_PROC();

   ```

## 禁用窗口合并任务

如果不期望再触发窗口合并，可以调用 `DBMS_SCHEDULER` 系统包的 `DISABLE` 子程序禁用窗口合并任务。

   ```
 2. 调用 `DBMS_SCHEDULER` 系统包的 `DISABLE` 子程序，禁用窗口合并。

   ```shell
   obclient> CALL DBMS_SCHEDULER.DISABLE('DAILY_MAINTENANCE_WINDOW');

   ```

禁用窗口合并任务后，系统将无法再触发窗口合并（触发周期性窗口合并、手动触发一次窗口合并等均不可以）。此外，如果租户级配置项 `enable_window_compaction` 的值仍为 `True`，则系统既不会触发窗口合并，也不会触发每日租户合并。如果期望在禁用窗口合并任务后执行每日租户合并，则需要将租户级配置项 `enable_window_compaction` 的值设置为 `False`。开启每日租户合并的详细操作，参见 [定时触发每日租户合并](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684837)。

配置项 [enable_window_compaction](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685458) 和窗口合并任务 `DAILY_MAINTENANCE_WINDOW` 的取值与每日合并行为之间的关系如下：

| enable_window_compaction | DAILY_MAINTENANCE_WINDOW | 每日合并行为 |
| --- | --- | --- |
| False | False（`CALL DBMS_SCHEDULER.DISABLE('DAILY_MAINTENANCE_WINDOW');`） | 触发每日租户合并 |
| False | True（`CALL DBMS_SCHEDULER.ENABLE('DAILY_MAINTENANCE_WINDOW');`） | 触发每日租户合并 |
| True | False （`CALL DBMS_SCHEDULER.DISABLE('DAILY_MAINTENANCE_WINDOW');`） | 不触发任何合并，即既不触发窗口合并，也不触发每日租户合并 |
| True | True（`CALL DBMS_SCHEDULER.ENABLE('DAILY_MAINTENANCE_WINDOW');`） | 触发窗口合并 |

## 相关文档

- [定时触发每日租户合并](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684837)
 - [手动触发合并](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684831)
 - [手动控制合并](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684832)
 - [查看合并信息](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684833)

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