超低内存磁盘检索
可获得性
本特性自openGauss 8.0.0-RC1版本开始引入。
特性简介
随着推荐系统、图像识别、自然语言处理等AI应用的普及,向量数据的规模从百万级快速走向亿级,内存成为大规模向量检索的主要成本。DiskANN以图索引加磁盘存储的混合架构降低了内存消耗,但索引中仍然保存完整的原始向量,检索时的内存占用与原始数据同量级。超低内存磁盘检索在DiskANN的基础上引入PCA降维与RaBitQ量化,索引只保存压缩编码,图遍历用位运算估算距离,候选集再回堆表用原始向量精排,在保持查询性能与召回的同时进一步降低索引体积和检索内存,满足企业在内存受限条件下管理大规模向量数据的需求。
客户价值
- 内存与存储成本下降:索引不再保存原始向量,图遍历只读取压缩编码,相同配置的机器可以承载更大规模的向量数据。
- 查询性能保持:压缩编码的位运算估距访存量小,配合原始向量精排,在高召回下保持低查询延迟。
- 使用方式不变:沿用DiskANN的SQL语法创建索引并按距离排序查询,向量与业务数据同库,共用事务、权限、备份和主备能力。
- 数据可持续变化:支持INSERT、UPDATE、DELETE和VACUUM,大量增删后可通过REINDEX重整索引。
特性描述
本特性通过DiskANN索引选项enable_rabitq = on启用。开启后索引采用新的磁盘格式(元数据version为2),不再保存原始向量,实现原理如下:
向量压缩
PCA降维把向量投影到方差最大的主成分方向上,缩短编码长度,
pca_dim为0时不降维;RaBitQ量化对变换后的向量逐维做1bit或2bit量化,得到定长的压缩编码。PCA投影与随机正交旋转在创建索引时训练并固化,后续插入的数据沿用同一变换,不重新训练。混合存储架构
索引:存储压缩编码与Vamana图结构,用于图遍历和候选集筛选。
堆表:保存完整的原始向量,用于候选集的精确距离计算。
索引检索
图遍历阶段只读取压缩编码,用位运算估算距离,按
diskann_probes维护候选集;候选集确定后回堆表读取原始向量计算精确距离并排序输出。量化误差只影响召回,返回结果的距离由原始向量计算。索引更新
新插入的向量沿用创建索引时的变换与量化参数,用估算距离选取邻居入图,完全相同的向量会合并到同一个索引节点。删除或更新掉的旧向量由检索时的回表精排过滤,其索引项在VACUUM时清理。大量插入导致数据分布变化,或大量删除导致空节点累积后,需要REINDEX重整。
主要索引选项:
enable_rabitq:是否启用本特性,默认off,不能与enable_pq同时开启。pca_dim:PCA降维后的维度,取值为0(不降维,默认值)或8~维度-1。rabitq_bits:每维量化位数,取值为1或2(默认值为1)。
enable_rabitq、pca_dim、rabitq_bits决定索引的磁盘格式,索引建成后不可通过ALTER INDEX修改,需要删除后重建。
构建与查询还受diskann_build_in_memory、diskann_probes、rbq_query_bits等参数影响,其中diskann_probes、rbq_query_bits的通用说明参见DataVec向量引擎参数。
详细的创建、查询和增删步骤请参考超低内存磁盘检索。
特性增强
无。
特性约束
- 仅支持vector数据类型,维度不超过1536,未指定向量列维度时无法构建索引。
- 仅支持普通行存表、临时表、Toast表、Unlogged表、段页式表等,不支持ustore表。
- 不支持表达式索引,需要直接对向量列创建索引。
enable_rabitq与enable_pq不能同时开启;pca_dim、rabitq_bits需在enable_rabitq = on时使用。pca_dim取非0值时表中数据量不少于16384行,空表和小表只能使用不降维的超低内存磁盘检索。enable_rabitq、pca_dim、rabitq_bits不允许通过ALTER INDEX修改,需要删除索引后重建。- 精排需要读取堆表中的原始向量,因此不支持仅索引扫描。
- 若在兼容B库中使用向量索引,需要执行
set dolphin.nulls_minimal_policy=false,用于关闭nulls处理策略。 - 主备环境开启极致RTO情况下,不支持向量索引功能。
- 本特性构建的索引无法被未完成升级的旧版本节点读取,版本回退前需要删除该索引。
- 支持ARM/x86架构,兼容A/B/C/PG库。
依赖关系
使用指导
建议先导入数据再创建索引。设置pca_dim时,表中数据量不少于16384行。
使用L2距离创建1bit、不降维的超低内存磁盘检索索引:
CREATE INDEX ON items USING diskann (embedding vector_l2_ops) WITH (enable_rabitq = on);使用余弦距离创建先PCA降至448维、再按2bit量化的超低内存磁盘检索索引:
CREATE INDEX ON items USING diskann (embedding vector_cosine_ops) WITH (enable_rabitq = on, pca_dim = 448, rabitq_bits = 2);查询时设置diskann_probes并按距离排序:
SET diskann_probes = 128;
SELECT id FROM items ORDER BY embedding <-> '[1,2,3,4]' LIMIT 10;更多参数说明与错误示例请参考超低内存磁盘检索。