对于增量数据较多的表,有哪些优化方式?

@论坛小助手 可以设置buffer表解决吗?

1 个赞

根据文档库中的信息,对于增量数据较多的表,可以从以下几个方面进行优化:

1. 关于 Buffer 表

  • Buffer 表的定义与触发条件
    根据文档《SQL 调优典型场景和案例 → SQL性能优化 → 执行计划优化 → Buffer 表》,Buffer 表是一种特殊业务场景下的 SQL 异常。它通常发生在以下场景:

    • 表中数据执行 INSERT 后,绝大部分数据很快会被 DELETE,存量数据很小。
    • 短时间内 INSERTDELETE 的数据量级非常大,且数据块高水位没有及时回收,或者 INSERT 量级大于 DELETE 量级导致数据积压。
    • 这种情况会导致真实扫描的表数据块较多,从而引发 SQL 性能下降。
  • 是否可以通过设置 Buffer 表解决?
    文档中并未提到可以“设置” Buffer 表来解决问题。实际上,Buffer 表是由于特定业务场景(如频繁的 INSERTDELETE)导致的性能问题。如果遇到此类问题,建议通过以下方式优化:

    • 使用 outline 绑定索引(如 settle_id 索引)以稳定执行计划。
    • 在 Hint 中指定索引字段,牺牲部分日常性能以保证 SQL 性能稳定。

因此,不能简单地通过“设置 Buffer 表”来解决增量数据较多的问题。


2. 统计信息收集

  • 统计信息的重要性
    根据文档《OceanBase 数据库性能的影响因素 → 合并与统计信息收集 → 统计信息收集》和《统计信息概述》,准确有效的统计信息能够帮助优化器选择最优的执行计划。在 OceanBase V4.0 之前,统计信息收集依赖每日合并,可能导致不准确或无法收集直方图信息。V4.0 版本将统计信息收集与每日合并解耦,提升了准确性。

  • 优化建议
    对于增量数据较多的表,建议手动收集统计信息以确保优化器生成最优执行计划:

    • 使用 DBMS_STATS 包或 ANALYZE 语句手动收集统计信息(见文档《手动收集统计信息》)。
    • 在会话级别调大 ob_query_timeout 参数,避免因超时中断统计信息收集。

3. 向量索引维护

  • 向量索引的作用
    根据文档《向量索引 → 索引维护》,当增量数据过多时,查询性能可能会下降。为减小增量数据表的数据量,可以使用 DBMS_VECTOR 对向量索引进行维护。

  • 优化建议
    如果表中存在向量索引,定期维护索引可以有效提升查询性能。


4. 存储层估行机制

  • 实时统计信息
    根据文档《存储层估行》,OceanBase 引入了实时的存储层估行机制,可以在统计信息过时的情况下获取更准确的行数估算。这有助于优化器在面对大量增量数据时选择更优的执行计划。

5. 其他优化建议

  • 分区表设计
    如果表的数据量较大且增量数据较多,可以考虑使用分区表(见文档《关于表》)。分区表可以将数据按一定规则分散存储,减少单个分区的数据量,从而提升查询性能。

  • 调整数据库参数
    根据文档《OceanBase 数据库性能的影响因素 → 数据库参数调优 → OLAP 场景》,可以调整以下参数以优化性能:

    SET GLOBAL ob_sql_work_area_percentage = 80;
    SET GLOBAL ob_query_timeout = 36000000000;
    SET GLOBAL ob_trx_timeout = 36000000000;
    SET GLOBAL max_allowed_packet = 67108864;
    SET GLOBAL parallel_servers_target = 624;
    

总结

对于增量数据较多的表,优化方式包括但不限于:

  1. 手动收集统计信息,确保优化器生成最优执行计划。
  2. 使用分区表设计,减少单个分区的数据量。
  3. 定期维护向量索引(如果存在)。
  4. 调整数据库参数以适应高并发或大数据量场景。
  5. 利用存储层估行机制获取更准确的统计信息。

至于“设置 Buffer 表”,并非一种可行的优化方式,而是需要针对具体业务场景采取上述优化措施。

更多信息请查看:

  1. SQL 调优典型场景和案例
  2. OceanBase 数据库性能的影响因素
  3. 统计信息概述
  4. 添加节点
  5. 向量索引
  6. 手动收集统计信息
  7. 存储层估行
  8. OceanBase 数据库概述
  9. 关于表
2 个赞

牛啊!大神

2 个赞

可以设置批量,比如源表是一条一条进来的,批量成1000条做batch

1 个赞

还是很多不懂,一起学习!

1 个赞

感谢指导!

1 个赞

跟着学习

1 个赞