default_progressive_merge_num 参数值疑问

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
合并有4中方式:全量 ,增量,合并
default_progressive_merge_num = 0 就代表着增量合并吗 ???

1 个赞

OceanBase 数据库支持对表数据进行渐进合并,即在对表执行需要重写数据的 DDL 操作后,可以将表数据的重写分散到多次合并中,一次合并中只进行部分数据的重写。您可以通过表级属性 progressive_merge_num 来控制合并行为,也可以通过 default_progressive_merge_num 配置项来设置新建一张表时默认的渐进合并次数。

当您未对新建表指定 progressive_merge_num属性时,系统会将表级属性 progressive_merge_num 的值设置为 default_progressive_merge_num 的值。

progressive_merge_num 属性的取值含义如下:

  • progressive num = 0 时,表示使用默认值 100。
  • progressive num = 1 时,表示强制执行全量合并,不执行渐进合并。
  • progressive num = X 时,表示 X 轮合并重写完全部数据,每轮合并重写 1/X。

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220391

1 个赞


怎么查看或者确认我使用的是 增量合并呢 ?

1 个赞

默认就是代表增量合并

  • progressive num = 0 时,表示使用默认值 100。100次重写完所有数据
1 个赞

好像只能通过这个参数判断。没看到专门的参数

1 个赞

当默认值等于 0 , 代表默认值 100 就是 增量合并, 100次完成增量合并。

那和渐进合并有什么区别呢 ?? 最大区别在哪里 ?

1 个赞

@论坛小助手

1 个赞

根据文档库中的信息,我将为您详细解答关于 default_progressive_merge_num 参数值以及不同合并方式的区别。

1. 关于 default_progressive_merge_num = 0 的含义

  • 默认值解释:当 default_progressive_merge_num 设置为 0 时,表示使用默认值 100。这意味着在表模式发生变化(如增加列、修改压缩算法)时,系统会进行渐进合并,并且默认情况下会进行 100 轮合并,每轮合并重写 1/100 的数据。
  • 是否代表增量合并default_progressive_merge_num = 0 并不直接代表增量合并。它实际上是指渐进合并的默认行为,即通过多次小规模的合并来完成整个表的重写。而增量合并是指只合并被修改过的宏块,没有改变的宏块进行复用。

2. 如何确认当前使用的合并方式

要确认当前使用的合并方式,可以通过以下几种方法:

  • 查看配置项

    • 使用 SQL 查询当前租户的配置项:
      SHOW PARAMETERS LIKE 'default_progressive_merge_num';
      
    • 查看表级别的 progressive_merge_num 属性:
      SHOW TABLE STATUS LIKE 'your_table_name';
      
  • 监控日志和统计信息

    • 通过 OCP 或者 OBProxy 等工具查看合并任务的日志和统计信息,了解具体的合并行为。

3. 渐进合并与增量合并的区别

  • 渐进合并

    • 定义:每次全量合并一部分,若干轮次后整体数据被重写一遍。目的是控制单次合并的时间,避免一次性合并大量数据对系统性能的影响。
    • 适用场景:主要用于表模式发生变化(如增加列、修改压缩算法)时,需要更新所有行的情况。
  • 增量合并

    • 定义:仅仅合并被修改过的宏块,没有改变的宏块进行复用。极大地减少了合并的工作量,是 OceanBase 数据库目前默认的合并算法。
    • 适用场景:适用于日常的数据维护,减少不必要的 IO 和 CPU 开销。

4. 总结

  • 最大区别
    • 渐进合并 是一种分阶段完成全量合并的方式,通过多轮次逐步完成数据重写,适用于表结构变化等需要重写所有数据的场景。
    • 增量合并 则是只处理被修改的数据块,复用未修改的数据块,适用于日常维护,减少资源消耗。

希望以上信息能帮助您更好地理解 default_progressive_merge_num 参数以及不同合并方式的区别。如果您有更多问题,欢迎继续咨询。

具体信息可参考以下文档:

  1. default_progressive_merge_num
  2. OceanBase 术语
  3. 修改合并配置
  4. OPTIMIZE
  5. 合并管理概述
  6. log_restore_concurrency
  7. log_archive_concurrency
  8. 自适应合并
  9. 数据导入策略与最佳实践
2 个赞

@论坛小助手 怎么判断默认使用的是增量合并?

1 个赞

根据文档库中的信息,要判断 OceanBase 数据库是否默认使用增量合并,可以通过以下几种方法进行确认:

1. 查看系统配置项

OceanBase 默认使用增量合并作为其合并算法。您可以通过查询系统参数来确认这一点。

SHOW PARAMETERS LIKE 'default_progressive_merge_num';
  • 如果 default_progressive_merge_num 的值为 0(即默认值 100),则表示在表模式发生变化时会进行渐进合并。
  • 但这并不影响日常的增量合并行为,因为增量合并是默认的合并算法。

2. 查看表级别的合并配置

您可以查看特定表的合并配置,以确认是否启用了增量合并。

SHOW TABLE STATUS LIKE 'your_table_name';

这将显示表的详细信息,包括其合并策略。

3. 监控和日志分析

通过 OCP 或者 OBProxy 等工具查看合并任务的日志和统计信息,了解具体的合并行为。

  • OCP:登录 OCP 控制台,导航到“监控与告警”模块,查看合并任务的执行情况。
  • OBProxy 日志:检查 OBProxy 的日志文件,寻找与合并相关的日志条目。

4. 使用 SQL 查询合并状态

您可以使用以下 SQL 查询当前租户的合并状态:

SELECT * FROM GV$OB_MAJOR_COMPACTION;

此视图提供了关于正在进行或已完成的合并任务的详细信息,包括合并类型(全量、增量等)。

5. 观察系统性能和资源使用

增量合并的一个显著特点是它对系统资源的影响较小。如果您观察到系统在合并期间的 IO 和 CPU 使用率较低,并且合并时间较短,这通常是增量合并的表现。

总结

根据文档中的信息,OceanBase 数据库默认使用增量合并作为其合并算法。要确认这一点,您可以:

  • 查询系统参数 default_progressive_merge_num
  • 查看表级别的合并配置。
  • 使用监控工具和日志分析。
  • 查询合并状态视图 GV$OB_MAJOR_COMPACTION
  • 观察系统性能和资源使用情况。

希望这些方法能帮助您确认 OceanBase 是否默认使用增量合并。如果有更多问题,请随时联系我。

具体信息可参考以下文档:

  1. OceanBase 术语
  2. 合并管理概述
  3. 自适应合并
  4. 阅读和管理 OceanBase 数据库 SQL 执行计划
  5. default_progressive_merge_num
  6. 手动控制合并
  7. OceanBase 数据库性能的影响因素
1 个赞

可不可以这样子理解

  1. 没有DDL 的表 进行 增量合并

  2. 进行DDL 的表 进行 渐进合并

  3. 一次合并 可能触发 渐进合并,增量合并 。如果单表设置 progressive_merge_num =1 还会触发 全量合并

#####################################
一次合并 可能触发三种 对象 sstable 的 合并方式 ??

1 个赞

越整越蒙了

什么时候用全量合并?什么时候用的是增量合并?

ALTER SYSTEM MAJOR FREEZE; 是全量合并还是增量合并?
@论坛小助手

1 个赞

您的理解部分正确,但为了更清晰地解答您的疑问,我将详细解释不同合并方式的触发条件和应用场景。希望这能帮助您更好地理解 OceanBase 的合并机制。

1. 合并方式的触发条件

增量合并(Incremental Compaction)

  • 适用场景:日常数据维护。
  • 触发条件
    • 默认情况下,OceanBase 使用增量合并。
    • 只有被修改过的宏块会被合并,未修改的宏块直接复用。
    • 适用于没有 DDL 操作的表。

渐进合并(Progressive Compaction)

  • 适用场景:表模式发生变化时(如增加列、修改压缩算法)。
  • 触发条件
    • 当表结构发生变更时,系统会进行渐进合并。
    • 渐进合并通过多轮次逐步完成数据重写,默认情况下是 100 轮。
    • 如果设置了 progressive_merge_num = X,则表示 X 轮合并重写完全部数据,每轮合并重写 1/X。

全量合并(Full Compaction)

  • 适用场景:需要对整个表的数据进行重写的情况。
  • 触发条件
    • 当设置 progressive_merge_num = 1 时,强制执行全量合并。
    • 表模式发生变化且用户明确要求一次性完成所有数据的重写。
    • 在某些特殊情况下,如存储属性发生变更(如修改压缩级别),可能需要全量合并。

2. ALTER SYSTEM MAJOR FREEZE; 是什么类型的合并?

ALTER SYSTEM MAJOR FREEZE; 触发的是 全量合并(Major Compaction)。具体来说:

  • 全量合并:将静态数据全部读出并与动态数据合并为最终的静态数据。合并时间长,耗费 IO 和 CPU。
  • 触发时机:当您手动执行 ALTER SYSTEM MAJOR FREEZE; 或者系统自动触发每日合并时,会启动全量合并。

3. 一次合并可能触发多种合并方式吗?

在一次合并操作中,确实可能会涉及不同的合并方式,但这取决于具体的上下文:

  • 日常合并:默认使用增量合并,只处理被修改的数据块。
  • DDL 操作后:对于进行了 DDL 操作的表,会触发渐进合并,分阶段完成数据重写。
  • 特定配置下:如果设置了 progressive_merge_num = 1,则会触发全量合并。

4. 总结

  • 增量合并:默认用于日常数据维护,适用于没有 DDL 操作的表。
  • 渐进合并:用于表模式发生变化时,分阶段完成数据重写。
  • 全量合并:当设置 progressive_merge_num = 1 或者执行 ALTER SYSTEM MAJOR FREEZE; 时触发,适用于需要一次性重写所有数据的情况。

示例 SQL 查询

要确认当前使用的合并方式,可以使用以下 SQL 查询:

-- 查看系统参数 default_progressive_merge_num
SHOW PARAMETERS LIKE 'default_progressive_merge_num';

-- 查看表级别的合并配置
SHOW TABLE STATUS LIKE 'your_table_name';

-- 查询当前租户的合并状态
SELECT * FROM GV$OB_MAJOR_COMPACTION;

希望这些解释能帮助您更清楚地理解 OceanBase 的合并机制。如果有更多问题,请随时联系我。

具体信息可参考以下文档:

  1. 手动控制合并
  2. OceanBase 术语
  3. 合并管理概述
  4. OceanBase 数据库性能的影响因素
  5. 合并
1 个赞

通过表级属性progressive_merge_num控制合并行为,创建表时未指定progressive_merge_num则被设置为default_progressive_merge_num
控制表的合并行为,取值范围为[0-100]:
当设置为0时,表示执行渐进合并,每次合并均做增量合并,且渐进合并的次数为 100。
当设置为1时,每次合并均做全量合并,不执行渐进合并。
当设置为>1时,发生schema变更时按照指定轮次做渐进合并

开启渐进合并以后,会按照渐进轮次完成一次全量合并(这里的意思是所有宏块都打开重写),但每轮合并,只会打开重写一部分,其余部分都是按增量合并的逻辑执行(即能重用的宏块就重用)。
举个例子,合并一共涉及100个宏块,渐进轮次100,第一轮合并第一个宏块必须打开重写(全量合并),其余99个宏块可以根据是否有修改来进行重用(增量合并),第二轮第二个宏块必须打开重写,其余99个宏块可以根据是否有修改来进行重用,以此类推。

一次合并 可能触发三种 对象 sstable 的 合并方式 ??
会不会呢 ? 因为 不同表的progressive_merge_num 值不一样 。

你看看这个三个数值的含义 你理解一下
image

我这都是猜测。就是想在 社区中求证的。 麻烦各位老师准确答复下。

可能存在,但是当前默认是做增量合并。这个一般情况下不会有人修改progressive_merge_num参数