调整哪些参数可以让insert into的效率更高

【 使用环境 】生产环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

@论坛小助手

1 个赞

对于提高 INSERT INTO 操作的效率,可以从多个方面着手,包括但不限于参数调整、索引优化、数据模型设计等。下面是几个可能有帮助的参数和方法:

参数调整

  1. batch_insert_size

    • 这个参数控制了单个插入操作中可以包含的最大记录数。如果您的应用能够批量处理插入,增加这个值可能会提高插入速度。
    • 建议:尝试增大 batch_insert_size 的值,但需要注意的是过大的值可能导致内存占用过高或事务过长。
  2. memstore_limit_percentagememstore_limit_abs

    • 这两个参数分别设置每个分区服务器上的 memstore 使用的内存百分比上限和绝对大小上限。增加这些值可以让更多的数据保持在内存中,减少写入磁盘的次数。
    • 建议:适当增加这两个值,但是要注意避免内存溢出的风险。
  3. freeze_trigger_percentagefreeze_trigger_diff_percentage

    • 控制数据冻结(即触发合并)的条件。适当调整这些参数可以帮助优化写入性能,尤其是在数据写入密集的情况下。
    • 建议:根据实际写入速率调整这些参数,防止频繁的合并影响性能。
  4. enable_minor_freeze

    • 如果您的表有大量的删除操作,开启小合并可以回收这部分空间。
    • 建议:如果业务场景中存在大量删除操作,可以考虑开启此参数。
  5. minor_freeze_timesmajor_freeze_times

    • 设置自动触发小合并和大合并的次数阈值。合理配置这些值可以减少不必要的合并开销。
    • 建议:根据实际写入频率调整这些参数。

索引优化

  • 减少索引数量:每个额外的索引都会增加插入的开销。如果某些索引在写操作中不是必须的,可以考虑暂时禁用或删除。
  • 选择合适的索引类型:根据查询模式选择最适合的索引类型(例如 BTree 索引或哈希索引)。

数据模型设计

  • 水平拆分:如果单表的数据量非常大,可以考虑使用水平拆分来分散插入压力。
  • 数据预分配:在插入前预分配足够的空间,减少动态扩展带来的性能损耗。

其他方法

  • 异步插入:通过消息队列或其他异步机制将插入请求批量处理,减轻数据库的压力。
  • 并发控制:合理设置并发度,避免过多的并发插入导致锁竞争。

推荐使用 obdiag 工具

您可以使用 obdiag 工具来收集和分析与性能相关的日志,特别是 SQL 性能问题相关的日志。这将有助于您进一步了解 INSERT INTO 操作的性能瓶颈所在。

日志采集场景

日志采集场景: SQL性能问题
日志采集命令: obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

为了更有效地解决问题,我们需要您提供一些额外的信息:

  1. 当前 INSERT INTO 操作的具体 SQL 语句是什么?
  2. 表结构如何?特别是关于索引的设计。
  3. 插入操作的频率和数据量是多少?
  4. 目前 batch_insert_sizememstore_limit_percentagefreeze_trigger_percentage 等关键参数的配置情况。
  5. 是否有其他并发操作(如查询、更新、删除)同时进行?
  6. 系统当前的负载情况如何?是否经常出现高 CPU 或高 I/O 等情况?

请根据上述建议调整参数,并使用 obdiag 工具收集相关日志。如果有任何问题或需要进一步的帮助,请随时联系。

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞

为了提高 INSERT INTO 的效率,您可以考虑调整以下参数,特别是在生产环境中使用 OceanBase 数据库时:

  1. 并行执行线程数量

    # 租户在每个节点上可申请的并行执行线程数量
    SET GLOBAL parallel_servers_target = 624;
    

    增加并行执行线程数量可以提升并行处理能力,从而加快数据插入速度。

  2. 事务超时时间

    # 设置事务超时时间
    SET GLOBAL ob_trx_timeout = 36000000000;
    

    增加事务超时时间可以避免因超时而导致的事务中断,尤其是在大量数据插入时。

  3. SQL 最大执行时间

    # 设置 SQL 最大执行时间
    SET GLOBAL ob_query_timeout = 36000000000;
    

    增加 SQL 最大执行时间可以确保长时间运行的插入操作不会被中断。

  4. SQL 工作区内存占整个租户内存百分比

    # 设置 SQL 工作区内存占整个租户内存百分比
    SET GLOBAL ob_sql_work_area_percentage = 80;
    

    增加 SQL 工作区的内存占比可以提高查询和插入操作的性能。

  5. 关闭 SQL 审计功能

    # 关闭 SQL 审计功能
    ALTER system SET enable_sql_audit=false;
    

    关闭 SQL 审计功能可以减少日志记录,从而提高插入效率。

  6. 关闭性能事件的信息收集功能

    # 关闭性能事件的信息收集功能
    ALTER system SET enable_perf_event=false;
    

    关闭性能事件的信息收集功能可以减少系统开销,提高插入效率。

  7. 设置系统日志级别为 ERROR

    # 设置系统日志级别为 ERROR
    ALTER system SET syslog_level='ERROR';
    

    减少日志记录可以提高系统性能。

  8. 关闭记录追踪日志

    # 关闭记录追踪日志
    alter system set enable_record_trace_log=false;
    

    关闭记录追踪日志可以减少系统开销,提高插入效率。

  9. 使用旁路导入功能
    如果没有事务要求,可以使用 INSERT INTO SELECT 加上旁落导入功能,一次性将数据插入到新表。这种方式既可以缩短导入时间,也可以避免写入太快导致内存不足的问题。

    # 适用于 V4.1 及之后版本
    INSERT INTO target_table SELECT * FROM source_table;
    
  10. 调整 clog 盘阈值
    如果 clog 盘空间不足,可以通过调整以下参数来优化 clog 盘的使用:

    # 调整 clog 盘阈值
    ALTER system SET log_disk_utilization_limit_threshold  = 98 server ='[IP 地址]:2882';
    
  11. 磁盘划分
    在资源充足的情况下,推荐分别挂载三块磁盘并使用 SSD 存储,如果机器上没有三块磁盘,或者使用的是 RAID 磁盘阵列,需要对磁盘或者磁盘阵列的逻辑卷进行分区。这可以减少磁盘竞争,提高写入性能。

以上参数的调整需要根据实际业务场景和资源情况进行合理配置,建议在调整前进行充分的测试和评估。

详情请参考:

  1. OceanBase 数据库性能的影响因素
  2. 进行 TPC-H 测试
  3. 设置并行执行参数
  4. get_tenant 失败后重试无法退出
1 个赞


只是一个简单的json解析,两亿条数据插入,用时1小时四十分,这个有什么具体的优化方案吗,该设置的参数都设置了

1 个赞

收集下详细的SQL信息看下

obdiag gather scene run --scene=observer.perf_sql [options]

https://www.oceanbase.com/docs/common-obdiag-cn-1000000004222779

1 个赞

弄不明白这个obdiag这个工具还有其他方法吗

1 个赞

哪里不明白?我找obdiag的研发给你回复解答

1 个赞

权限问题没有授权linux的用户密码

1 个赞

没有OS的账号 好像是不行

1 个赞

sql_result.txt (6.1 MB)
可以看出来吗

1 个赞

这个文件能看出来配置,参数设置,状态等信息,应该还有个plan_monitor文件 也发下吧

1 个赞

image
生成了只有这一个文件

1 个赞

正常是这些文件,你这里缺少文件,我找人看看

1 个赞

谢谢

1 个赞

hello 想问下这是在配置正常的情况下执行的么?我看缺失的文件还挺多的,如果是linux的密码配置的话,obdiag也支持免密模式配置节点

1 个赞

应该是没有密码的问题,这个两亿条数据插入用时一小时40分正常吗

有免密怎么配置

从数量级来看问题不大,而且还要解析json数据

免密这一行不要

--config obcluster.servers.global.ssh_password=****** \