OceanBase VSAG 向量索引导致 MyBatis 批量插入

阿海爱学习 高级 9小时前 548 浏览 15 点赞 约 1 分钟

1536维的向量数据在 OceanBase 4.3.3 (MySQL 模式) 里一旦开了 VSAG 索引,写入性能简直断崖式下跌。

最近在做向量数据迁移,用 Spring Boot + MyBatis-Plus 的 saveBatch 跑数据,每批 200 条。结果只要表上挂了 VSAG 索引,就频繁报这个错:

JDBC SQLState: XA102, Error Code: 4012 - Transaction timeout or statement timeout exceeded

最诡异的是,如果把这个向量索引删掉,同样 5 万条数据几秒钟就刷完了,完全没压力。说明问题不在于数据量,而是在于索引维护。

为了解决这个问题,我尝试在 Session 级别把 ob_query_timeoutob_trx_timeout 全调到了 120 秒以上,但依然没能根治,还是会触发超时崩溃。

目前的排查结论:
VSAG 这种基于图的索引在批量插入时,同步维护索引的开销极大。每批次写入时,索引构建可能长时间占用事务锁,导致后续批次被阻塞,最终撑爆超时阈值。

现在比较纠结的点:
OceanBase 是否支持将 VSAG 索引的维护改为异步(类似延迟构建或后台构建)?如果能像某些数据库那样先入库、后异步建索引,这种高吞吐的向量导入实战场景才跑得通。

有没有研究过 OceanBase 向量索引调优的大佬,分享一下针对 vector_data 这种高维字段的批量写入优化方案?

求助

全部回复 (3)

完美主义技术宅 专家 9小时前
这索引删了重跑快吗?我之前试过先插数据再建索引。
0 回复
折腾党阿凯 中级 9小时前
试过关掉自动提交手动走事务没,我之前得这么弄才稳。
0 回复
架构师老刘 中级 9小时前
试试把批次调小点,我之前调到50才勉强没报错。
0 回复

发表回复

支持 Markdown 格式