索引监控与维护
本文档介绍了如何监控和维护 seekdb 向量索引。
监控
通过系统视图可以查看向量索引的基本信息和实时状态。
- 可以通过 [G]V$OB_HNSW_INDEX_INFO 视图查看 HNSW 系列索引的基本信息和实时状态。
- 可以通过 [G]V$OB_IVF_INDEX_INFO 视图查看 IVF 系列索引的基本信息和实时状态。
维护
增量数据过多的情况下,搜索性能会下降。为减小增量数据表的数据量,seekdb 数据库引入了 DBMS_VECTOR 对向量索引进行维护。
增量刷新
此功能支持 HNSW 系列索引,语义索引,内存稀疏索引,不支持 IVF 系列索引。
语义索引如果使用的是异步嵌入模式,增量刷新时会额外触发数据的嵌入,以确保增量数据被正确转换为向量并添加到索引中。
如果建立索引后写入数据较多,建议使用 REFRESH_INDEX 过程进行增量刷新。说明和示例请参见 REFRESH_INDEX。
增量刷新每 15 分钟会检查一次,如果增量数据超过 1W 条,则自动执行增量刷新。
全量刷新(重建)
手动全表重建
如果建立索引后更新或 删除数据较多,建议使用 REBUILD_INDEX 过程进行全量刷新。说明和示例请参见 REBUILD_INDEX。
全量刷新每 24 小时会检查一次,如果新增数据超过原有数据的 20%,则自动执行全量刷新。全量刷新会在后台异步执行,首先创建新的索引,然后替换旧索引。在重建过程中,旧索引保持可用状态,但整体过程相对较慢。
我们还提供了 vector_index_memory_saving_mode 配置项来控制索引重建的内存占用。开启此模式可以降低分区表向量索引重建(rebuild)过程中的内存消耗。通常,向量索引重建需要消耗相当于索引两倍的内存。开启省内存模式后,系统会在分区表单个分区构建完成后,通过暂时删除该分区的内存索引来释放内存,从而有效降低重建操作所需的总内存。语法和示例请参见vector_index_memory_saving_mode。
注意事项如下:
-
执行 离线 DDL 操作(例如
ALTER TABLE修改表结构或主键)时,将导致索引表的重建。由于重建索引无法指定并行度,系统会默认使用单线程,因此在数据量较大时,重建过程会比较缓慢,从而影响整个 离线 DDL 的执行效率。 -
重建索引时如果需要修改索引参数,必须在参数列表中同时指定
type和distance,且type和distance必须和原索引类型一致,例如原来索引类型是hnsw,距离算法是l2,则重建时必须同时指定type=hnsw和distance=l2。 -
重建索引时支持:
- 修改
m,ef_search,ef_construction值。 - 在线重建
ef_search参数。 hnsw与hnsw_sq索引类型互相转换重建。ivf_flat与ivf_flat,ivf_pq与ivf_pq的索引类型互相转换重建。- 支持重建时设置并行度。示例见 REBUILD_INDEX。
- 修改
-
重建索引时不支持:
- 修改
type和distance类型。 hnsw与ivf的索引类型互相转换重建。hnsw与hnsw_bq的索引类型互相转换重建。ivf_flat,ivf_pq之间的交叉重建。
- 修改
自动分区重建(推荐)
此功能支持 HNSW 系列索引,语义索引,内存稀疏索引,不支持 IVF 系列索引。
语义索引在自动分区重建时,会同时处理增量数据与快照任务,确保索引数据的一致性与完整性。
当前版本会触发自动分区重建任务的场景有两种:
- 执行向量索引搜索语句时。
- 定时检查,可手动配置执行周期。
-
配置执行周期
在
oceanbase数据库下,通过配置项 vector_index_optimize_duty_time 配置执行周期。示例如下:ALTER SYSTEM SET vector_index_optimize_duty_time='[23:00:00, 24:00:00]';如上配置完成后,分区重建任务只会在 23:00:00~24:00:00 时间段执行,其他时间段里不会发起。详细参数说明参见相应配置项文档。
-
查看任务进展/历史任务
可通过 CDB/DBA_OB_VECTOR_INDEX_TASKS 或 CDB/DBA_OB_VECTOR_INDEX_TASK_HISTORY 视图查看任务进展和历史任务。
通过
status字段判断任务当前状态:- 0(PREPARE),表示任务等待执行。
- 1(RUNNING),表示任务正在执行中。
- 2(PENDING),表示任务暂停执行。
- 3(FINISHED),表示任务已完成。
执行结束的任务,即状态
status=FINISHED的任务,无论是否执行成功都会被转存到历史表。详细使用示例请参见相应视图文档。 -
取消任务
如需取消任务,可通过
DBA_OB_VECTOR_INDEX_TASKS或CDB_OB_VECTOR_INDEX_TASKS视图获取 trace_id 后,执行以下命令:ALTER SYSTEM CANCEL TASK <trace_id>;示例如下:
ALTER SYSTEM CANCEL TASK "Y61480BA2D976-00063084E80435E2-0-1";