向量索引选取建议
seekdb 提供了多种不同算法的向量索引,用户可以依据使用场景选择合适的索引类型。
本文档仅提供稠密向量索引类型的选型优化建议。
HNSW 还是 IVF?
seekdb 的稠密向量索引分为两大类:
- 基于图的 HNSW 系列索引:HNSW、HNSW_SQ、HNSW_BQ。
- 基于磁盘的 IVF 系列索引:IVF、IVF_PQ。
这两种索引类型各有侧重。HNSW 系列索引通常提供更高的查询性能,但需要占用更多常驻内存;而 IVF 系列索引在缓存充足时性能表现良好,且能够不依赖常驻内存运行。然而,选择 HNSW 还是 IVF 并非仅基于内存考量,业务场景、数据规模、性能指标以及资源约束等多个维度都需综合评估,下文将详细对比其核心差异并提供选择建议。
核心差异对比
| 对比维度 | HNSW 系列 | IVF 系列 |
|---|---|---|
| 存储方式 | 基于内存的图结构索引 | 基于磁盘的索引 |
| 内存占用 | 需要完整载入内存,内存占用高 | 可不占用常驻内存,内存占用低 |
| 查询性能(QPS) | 极高,毫秒级响应 | 较高,在缓存充足时接近 HNSW |
| 召回率 | 高,可达 99% | 较高,略低于 HNSW,可通过参数调优 |
| 构建速度 | 较慢,需要构建图结构 | 较快,基于聚类算法 |
| 适用数据量 | 百万级到亿级 | 百万级到十亿级 |
| 成本 | 内存成本高 | 存储成本低,适合大规模数据 |
| 实时性 | 支持实时 DML 操作 | 支持实时 DML 操作 |
决策流程图
- 在选择索引类型前,您需要先参考向量索引内存管理估算内存用量。
- 决策流程图中的选择建议均以 1024 维向量为参考,若实际维度不同,可按比例近似换算所需资源。
- 决策流程图主要从内存成本角度出发,帮助您决策索引类型。
- 即使租户内存充足,也不一定总是选择 HNSW 等最高规格索引。如果对极致性能有较高需求,可以考虑 HNSW_SQ 等更具性价比的选项。

这里仅列举了部分常用场景的决策流程,如果通过上述路径无法判断,或有其他需求,请联系 seekdb 技术支持。
是否使用分区表?
使用分区表的主要目的是为了解决大数据量的场景,其次是如果查询条件可以用于做分区键,那么通过分区裁剪可以提升查询性能。在以下两种场景下建议使用分区表:
- 数据量达到几千万或亿级以上:当数据量非常大时,使用分区表可以将数据分散到多个分区,每个分区独立构建索引,从而降低单次查询负载,提升整体查询性能。
- 查询条件中有明确的标量列可以用作分区裁剪:例如,如果
label字段总是会出现在WHERE条件中,那么就可以考虑以label作为分区键创建分区表,通过分区裁剪减少需要查询的分区数量。
具体使用建议如下:
分区划分
在使用向量索引时,分区数量不宜过多。与标量索引不同,向量索引(如 HNSW)在相同配置下,索引规模从 100 万向量增大到 200 万向量,查询 TopK 所需的计算开销并不会显著增加。因此,如果不能利用分区裁剪,过多的分区反而可能降低性能。另外,单个分区过大不仅会导致索引重建耗时增加,还会影响与标量条件联合查询时的效率。
综上,推荐将每个分区内的数据量控制在 2000 万以下,并优先选择能够支持分区裁剪的字段作为分区键。
算法选择
在大数据量下建议选择 HNSW_BQ 或 IVF_PQ 索引。如需使用其他索引,请参考下文内存占用章节进行估算。
内存占用
HNSW_BQ
对于 HNSW_BQ 索引,建议 租户内存 > HNSW_BQ 查询时总内存占用 + 单分区 HNSW_SQ 索引占用。内存预估流程如下:
- 优先通过
INDEX_VECTOR_MEMORY_ADVISOR函数计算 HNSW_BQ 及 HNSW_SQ 索引在构建及查询过程中的推荐内存值。 - 基于上述工具获得的推荐内存值,计算并确定租户所需内存总量。
例如,假设拥有 1 亿条 1024 维向量数据,采用 10 个分区(每个分区约 1000 万向量)。按照上述流程,具体计算过程如下:
-- 指定 REFINE_TYPE=SQ8 即可直接准确获取 HNSW_BQ 索引在构建及查询过程中的推荐内存值,
-- 无需再额外单独计算 HNSW_SQ 索引的占用。这是因为 HNSW_BQ 在构建时默认使用 SQ8 量化算法构图,
-- 指定 refine_type=sq8 后,函数会自动将该索引构建时所需的 SQ8 量化向量所需的内存计算在内
-- HNSW_BQ 索引的推荐内存值为 74.6 GB,查询时内存占用为 57.4 GB,我们取用推荐内存值
SELECT DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR('HNSW_BQ',100000000,1024,'FLOAT32','M=32,DISTANCE=COSINE,REFINE_TYPE=SQ8', 10000000);
+------------------------------------------------------------------------------------------------------------------------------+
| DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR('HNSW_BQ',100000000,1024,'FLOAT32','M=32,DISTANCE=COSINE,REFINE_TYPE=SQ8', 10000000) |
+------------------------------------------------------------------------------------------------------------------------------+
| Suggested minimum vector memory is 74.6 GB, memory consumption when providing search service is 57.4 GB |
+------------------------------------------------------------------------------------------------------------------------------+
1 row in set
-- 向量内存在租户内存中的占比默认为 50%,因此总租户内存为
SELECT 74.6/0.5;
+--------------------------------------------------------------------------------------------------------------+
| 74.6/0.5 = 149.2 GB |
+--------------------------------------------------------------------------------------------------------------+
1 row in set
-- 考虑到实际环境中新写入数据未及时压缩的情况,建议适当预留冗余
SELECT 149.2 * 1.2;
+--------------------------------------------------------------------------------------------------------------+
| 149.2 * 1.2 = 179.04 GB |
+--------------------------------------------------------------------------------------------------------------+
1 row in set
-- 因此,建议租户内存配置为 179 GB
IVF 系列
对于 IVF 和 IVF_PQ 索引,建议 租户内存 > 单个分区构建内存 + 所有分区常驻内存总和。例如,1 亿条数据,采用 10 个分区,每个分区约 1000 万向量,单分区构建时大约需要 2.7 GB 内存,查询时 10 个分区的 IVF_PQ 索引合计常驻约 1.1 GB(110 MB/分区)。因此,最低需配置大约 3 GB 内存。建议在此基础上适当留有富余,推荐配置 6 GB 内存。其他数据量场景可参照上述方法估算。
构建和查询参数
索引构建与查询参数建议以单分区的最大数据量为基准设置。详见下文索引参数建议章节。