【 使用环境 】 生产环境
【 OB or 其他组件 】OB
【 使用版本 】
oceanbase-ce :4.3.5.3
【问题描述】清晰明确描述问题
需求:一个建库任务构建1个向量表。
问题:A建库任务已完成, 向量表V_A数据已灌完。B建库任务进行中,向量表V_B正在添加数据。 V_A检索很慢,几十秒都有可能。当没有建库任务时,即没有任何向量表在写数据。V_A 和V_B检索,有时还是慢,速度不可控。如何去排查定位问题原因。
表结构:
CREATE TABLE data_warehouse_detail (
id bigint not null auto_increment COMMENT ‘自增主键’,
scene_url varchar(500) not null COMMENT ‘图片链接’,
shot_time datetime not null COMMENT ‘拍摄时间’,
device_id varchar(255) not null COMMENT ‘设备ID’,
person_count bigint not null COMMENT ‘人员数量’,
relation_id varchar(500) default null COMMENT ‘目标ID’,
obj_id varchar(500) default null COMMENT ‘追踪ID’,
target_type varchar(100) default null COMMENT ‘目标类型’,
x1 int default null COMMENT ‘边界框左上角的x坐标’,
y1 int default null COMMENT ‘边界框左上角的y坐标’,
x2 int default null COMMENT ‘边界框右下角的x坐标’,
y2 int default null COMMENT ‘边界框右下角的y坐标’,
reid_embedding VECTOR(512) default null COMMENT ‘reid向量’,
align_embedding VECTOR(768) default null COMMENT ‘对齐向量’,
create_time datetime not null COMMENT ‘创建时间’,
PRIMARY KEY (id),
index idx_shot_time_device_id_target_type (shot_time, device_id, target_type),
VECTOR INDEX idx_reid_embedding (reid_embedding) WITH (distance=cosine, type=hnsw, lib=vsag),
VECTOR INDEX idx_align_embedding (align_embedding) WITH (distance=cosine, type=hnsw, lib=vsag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘向量库明细表’;
查询语句:
SELECT t.id as id, t.scene_url as sceneUrl, t.shot_time as timestamp, t.device_id as deviceId, t.person_count as personCount, t.obj_id as objId, t.target_type as type, t.x1, t.y1, t.x2, t.y2, cosine_distance(t.reid_embedding, ?) AS simi FROM dw_1998913224163164160 as t WHERE t.reid_embedding is not null and t.shot_time >= ? and t.shot_time <= ? and t.target_type = ? ORDER BY simi APPROXIMATE LIMIT ?
看执行计划:
post-iterative-filter | t (idx_shot_time_device_id_target_type,idx_reid_embedding)
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
向量内存占比40%, 使用率1/20。 目前创建三个向量表, V_A, 19w数据, V_B, 10W 数据, V_C 140w数据
是不是索引 没有rebuild完呀 有手动做过索引的rebuild么?
没有进行过rebuild
如果有新灌的数据 建议还是先rebuild一下向量索引
ok. 是不是也意味着如果想实现边灌向量数据边快速查询,基本上无法实现
你看看向量索引的刷新机制 主要是变化量多的情况下 会有一定影响的
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002012936