大批量 insert 插入数据,OB 推荐使用什么写法,批量 insert 还是 merge into,线上要注意什么避免性能抖动?

求大神解答,小白一枚

1 个赞

@论坛小助手

大批量插入数据的推荐写法及注意事项

根据文档片段中的信息,OceanBase 对于大批量数据插入有一些推荐的做法以及需要注意的事项来避免性能抖动。以下是对您的问题的详细解答:

推荐使用的方法

  1. 单条 INSERT 多个值
    OceanBase 推荐将多行数据合并为一条 INSERT 语句插入,这样可以减少网络开销和提高导入效率。比如,如果您需要向表中添加多行记录,可以使用如下方式:

    INSERT INTO t_insert(id, name, value) VALUES (1, 'CN', 10001), (2, 'US', 10002);
    

    这种方法适用于向内部表写入少量数据的情况(见文档片段 3)。

  2. 使用 INSERT INTO SELECT FROM
    如果您需要从另一张表复制大量数据到目标表,可以考虑使用 INSERT INTO SELECT FROM 语法。这种方法特别适合表与表之间的迁移。

    INSERT INTO target_table SELECT * FROM source_table;
    
  3. 旁路导入
    对于大数据量的导入场景(全量或增量),建议利用旁路导入功能配合 INSERT /*+ APPEND */ hint 来实现高效的数据导入。这尤其适用于 V4.1 及以上版本的 OceanBase 数据库。

    INSERT /*+ direct(true, 0, 'full') enable_parallel_dml parallel(2) */ INTO tbl2 SELECT * FROM tbl1;
    

    注意:在执行增量旁路导入时,只需将 'full' 替换成 'inc_replace'(参见文档片段 7)。

避免性能抖动的注意事项

  • 控制单条 INSERT 的行数
    虽然推荐将多行数据合并为一条 INSERT 语句处理,但为了防止内存溢出或其他资源限制,单条 INSERT 语句中包含的行数应控制在合理范围内,官方建议不超过 200 行(参考文档片段 8)。

  • 适当设置并行度
    在使用 INSERT INTO SELECT 或者带有 APPEND hint 的 INSERT 语句时,可以通过调整并行度参数(如 parallel(N))以优化执行性能。但是,请注意根据实际集群资源情况调整合适的并行级别,过高可能导致系统负载过重从而影响其他操作。

  • 数据导入后的合并管理
    大批量数据导入后建议进行一次全量或增量合并,以提升查询性能。对于增量合并,如果没有人为干预,则依赖系统自动调度即可(参阅文档片段 2)。

综上所述,在 OceanBase 中进行大批量数据插入时,推荐优先考虑使用单条 INSERT 语句插入多行数据的方式,并且结合实际情况灵活运用旁路导入等高级特性;同时还需要关注单次操作涉及的数据量、并行度配置等因素,确保既高效又安全地完成任务。

更多信息请查看:

  1. 插入数据
  2. 数据导入策略与最佳实践
  3. 导入数据概述
  4. 合并管理概述
  5. SQL 基础操作(MySQL 模式)
  6. ETL 加速
  7. SQL 规范
  8. 使用 LOAD DATA 语句导入数据
  9. 设置并行执行参数
1 个赞