近日,OceanBase 官方发布 4.3.3 版本更新说明,其中一项涉及近似最近邻搜索(ANN_SEARCH)的行为变更引发社区关注。据文档披露,在并发行更新(Concurrent Row Updates)场景下,ANN_SEARCH 将自动放弃 VSAG 向量索引,回退至全表扫描(Full Table Scan)以完成查询。这一设计虽不影响数据一致性,但对高频写入下的向量检索性能可能造成显著影响。

背景:向量检索与 VSAG 索引

OceanBase 自 4.3 版本起正式支持向量检索能力,内置 VSAG(Vector Similarity Adaptive Graph)索引作为默认的近似最近邻搜索方案。VSAG 基于图结构构建,能够在海量向量数据中实现毫秒级召回,广泛应用于 AI 推理、图像比对、语义搜索等场景。在常规的读多写少负载下,VSAG 索引可大幅降低 ANN_SEARCH 的扫描代价,较暴力全表扫描提升数十倍性能。

问题描述:并发更新触发索引降级

根据官方文档,当目标表在 ANN_SEARCH 执行期间或之前发生并发行更新(即多个事务同时修改表中数据行),系统出于 MVCC(多版本并发控制)一致性保障的考量,会判定当前 VSAG 索引的元数据(Metadata)可能不再精确反映最新行版本。此时,OceanBase 的优化器将主动放弃使用 VSAG 索引,转而走全表扫描回表,通过逐行读取最新版本数据来保证查询结果的正确性。

具体触发条件包括:同一表存在未提交或刚提交的更新事务、表统计信息显著滞后,或索引分区发生分裂合并等。该行为并非 BUG,而是 OceanBase 在事务一致性与索引加速之间做出的稳健性妥协——确保向量查询在混合负载下不产生幽灵数据或遗漏更新。

影响分析:性能下降与应对策略

对于存算分离或 HTAP 场景而言,这一回退可能带来明显的性能波动。在典型 OLTP + 向量搜索混合负载中,若写操作频繁(如每秒千级行更新),ANN_SEARCH 将长期处于全表扫描状态,查询时延可能从 10ms 量级骤升至秒级,影响实时推荐、在线推理等业务。

OceanBase 官方建议用户采取以下缓解措施:

  1. 隔离读写负载:将向量查询的只读副本(Replica)与写入主副本分离,利用 OceanBase 的副本级别一致性策略,在只读副本上使用 VSAG 索引,避免与写路径冲突。
  2. 批量写入窗口:在业务低峰期进行大规模行更新,配合 SET _FORCE_SINGLE_PLAN 等 HINT 强制索引选择。
  3. 评估全表扫描容忍度:对于数据量较小(百万级以内)的表,全表扫描的绝对耗时可能仍在可接受范围,可暂不处理。

社区反馈与后续展望

该行为在 OceanBase 官方论坛引起讨论。部分用户指出,HNSW 等同类索引在 PostgreSQL pgvector 等产品中也存在类似“写时降级”问题,但通常采用增量重建策略而非直接回退。另有一些开发者建议 OceanBase 在后续版本中引入延迟索引更新写可见性检查机制,使 ANN_SEARCH 在轻量写压下仍能部分利用索引。

OceanBase 官方表示,已在 4.3.4 开发分支中着手优化写场景下的索引管理逻辑,预计将通过向量索引粒度的版本号比对,减少不必要的回退。最终方案有望在 2025 年 Q1 的迭代中发布。

结语

OceanBase 4.3.3 在向量检索功能上迈出了重要一步,但分布式数据库中的索引与事务一致性平衡始终是工程难题。ANN_SEARCH 在并发更新下的回退行为虽属“安全第一”,却也提醒用户:向量检索并非纯读流程,高频写入场景下的索引有效性仍需谨慎设计与测试。对于正在评估 OceanBase 向量能力的团队,建议结合自身写入负载密度,优先采用读写分离架构或等待后续优化版本。