insert插入慢

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】社区版v4.5.0
【问题描述】insert循环插入慢,插入5万次数据插入耗时58秒,同一台机器同样的表同样的函数,在mysql中耗不到3秒,是哪里没设置对吗,求大佬解答

下边是插入函数
CREATE DEFINER = root@% PROCEDURE insert()
MODIFIES SQL DATA
BEGIN
DECLARE
i INT;

SET i = 1;
WHILE
		( i <= 50000 ) DO
INSERT INTO `sgap`.`log_file_recv_user`(`channelId`, `log_time`, `deploy_address`, `send_ip`, `send_mac`, `send_port`, `recv_name`, `recv_ip`, `recv_mac`, `recv_port`, `file_name`, `file_id`, `file_size`, `md5_code`, `md5_check`, `trans_result`, `file_type_check`, `server_type`, `trans_dir`, `uploadFlag`, `task_id`, `task_name`, `dept_name`, `task_file_count`, `bind_label_result`, `label_level`, `label_drafter`, `label_person_liable`, `label_wrong`, `date_time`) VALUES (155, UNIX_TIMESTAMP(), '0', '192.168.3.34', '64-57-E5-12-CA-58', 8190, 'qq2', '192.168.3.72', '', 5435, '1.docx', 2, 11717, '930859ed35d50becd3c95f540d3ec878', 1, 1, 1, 1, 1, 0, '', '', '', 0, 1, '', '', '', '操作成功', NOW());

	
	SET i = i + 1;

END WHILE;

END

7 个赞

你可以使用obdiag收集一下 plan_monitor信息 看看慢在哪里
obdiag gather plan_monitor --trace_id YB420BA2D99B-0005EBBFC45D5A00-0-0
–env host=xx.xx.xx.xx --env port=2881 --env user=root@test --env password=*** --env database=test
–config db_host=xx.xx.xx.xx
–config db_port=xxxx
–config tenant_sys.user=root@sys
–config tenant_sys.password=***
https://www.oceanbase.com/docs/common-obdiag-cn-1000000005508593

怎么看报告慢在哪
obdiag_gather_pack_20260320155418.zip (146.1 KB)

看输出吧,实在不行问ai我都觉得快了

看看能不能 收集一下 你调用的函数 整个执行完以后 看看慢在哪里 或者你用show trace查看一下 从插入语句来看 执行挺快的

好像没法收集函数啊,我看等待耗时900多

看你好像是在sys租户下操作的是吧 不建议在sys租户下操作 可以在建个租户测试一下 你可以插入多个数据测试一下 在收集一下信息

文中提到的file问题很常见,通过优化recv和调整label配置,通常可以解决。

1 个赞

小工具不错

6666666

啥意思?

其他租户也是慢,这数据库晚上会优化,我啥也没动,周一来还是用sys再执行,他就快了,5万条2插入秒多

应该是转储合并了 内存中修改的数据 被转储到磁盘上合并压缩了 内存被释放出来了 应该也给租户的规格资源有关系
可以优化的点:

  • 单行小事务频繁提交:每条 INSERT 单独事务会放大日志与两阶段提交开销。尽量合并为批量:INSERT INTO ... VALUES (...), (...), ... 或多行 INSERT,或控制每批行数 + 每批 COMMIT(在可接受的一致性与失败粒度下)。
  • 大批量导入:若是一次性灌大量数据,优先考虑 LOAD DATA / OBLoader 等导入工具,而不是应用里循环单条 INSERT

之前看着也有commit类等待 event是sync tx commiting wait等待 主要是同步的commit等待,应该同步的路径在单会话上长时间占用,你可以在测试一下显式提交 是否还是很慢。

显式commit,快不少,5w条6秒,我用的是nvme的硬盘,读写能到3000MB,这速度感觉还是不快

你可以在用obdiag收集一下信息 看看sql audit是不是有等待 你是直连的还是通过obrpoxy连接的
使用show trace信息 查看一下慢在什么地方
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480373

我是直连的,show trace如下


这个是用navicate执行的,上边是在obclient里的

看着没有全部截图 可以截完整点 尽量把信息发完整点
不过从你发的信息来看 应该是spi调用时间的消耗很多 应该也是sql执行在消耗 可以把当时的observer.log日志也发一下


看着这个主要的时间是花费在硬解析上