HNSW索引必须用VECTOR_MEMORY_SIZE控制内存分配,因其不落盘、全驻SGA向量内存池,非传统段结构,DBA_SEGMENTS不可见;默认128MB常不足,建索引易报ORA-65432,需显式设为2G/1G并重启PDB生效。

为什么HNSW索引必须用VECTOR_MEMORY_SIZE控制内存分配
HNSW索引不存磁盘,全在SGA里跑,所以它根本不是传统意义上的“段”,而是向量内存池(Vector Memory Pool)里的图结构。你查DBA_SEGMENTS是看不到它的——它压根不走数据文件那一套。如果不显式调大VECTOR_MEMORY_SIZE,默认值往往只有128MB,连百万级768维向量都塞不下,建索引时直接报ORA-65432: insufficient vector memory。
实操建议:
-
ALTER SYSTEM SET vector_memory_size = 2G SCOPE=BOTH;(CDB级)或ALTER PLUGGABLE DATABASE pdb1 SET vector_memory_size = 1G;(PDB级),注意单位必须带G或M,不支持2048这种纯数字 - 改完要重启PDB(
ALTER PLUGGABLE DATABASE pdb1 CLOSE; ALTER PLUGGABLE DATABASE pdb1 OPEN;),SGA重分配才生效 - 监控用
V$VECTOR_MEMORY_POOL视图,重点关注CURRENT_USAGE_BYTES和MAX_USAGE_BYTES,别等OOM才看
IVF索引的段管理跟普通B树索引一样吗
不一样。IVF索引虽然落盘,但它不是按segment→extent→block那种标准段结构组织的。它的分区元数据存在DBA_VECTOR_INDEXES里,而实际向量簇(inverted list)以专有格式写入数据文件,DBA_EXTENTS里查不到对应记录。强行用ALTER TABLE ... MOVE或SHRINK SPACE会失败,报ORA-65433: operation not supported on vector index segments。
实操建议:
- 重建索引是唯一可控手段:
DROP INDEX idx_ivf ON tbl_vec; CREATE INDEX idx_ivf ON tbl_vec(vec_col) INVERTED FILE; - 建索引时加
TABLESPACE ts_vec指定专属表空间,避免和业务表争抢SYSTEM或SYSAUX - 定期用
ANALYZE INDEX idx_ivf VALIDATE STRUCTURE;检查元数据一致性,它比DBVERIFY更准
SPARSE向量对索引物理布局有什么隐性影响
SPARSE存储只存非零值,但IVF/HNSW索引在构建时仍按原始维度数做距离计算和邻居连接。这意味着:同样10万条768维向量,SPARSE版在磁盘上占的空间小,可HNSW图节点的内存开销几乎没降——因为图结构依赖维度对齐,稀疏性不压缩图连接数。你省了存储,但没省内存;反而可能因非零值分布不均,导致HNSW图局部连接过密,搜索时跳转次数变多。
实操建议:
- 只对真正稀疏的场景用SPARSE:比如用户行为向量(99%维度为0),别用在BERT嵌入这类天然稠密的数据上
- 建HNSW索引前先跑
SELECT AVG(VECTOR_DIMENSION_COUNT(vec_col)) FROM tbl_vec;确认平均非零维度占比低于15% - SPARSE向量+IVF索引组合时,务必在
CREATE INDEX里显式指定SPARSE,否则Oracle会静默转成DENSE再建索引
如何判断向量索引是否真的用了预期的物理策略
光看CREATE INDEX语句不够。Oracle允许你在同一列上同时建HNSW和IVF索引,但查询时只用一个——具体用哪个,取决于SQL里有没有/*+ VECTOR_INDEX */提示,以及优化器是否认为当前精度设置(ACCURACY)匹配索引能力。你看到索引建成功了,不代表它被命中。
实操建议:
- 强制走HNSW:
SELECT /*+ VECTOR_INDEX(t, idx_hnsw) */ * FROM tbl_vec t WHERE VECTOR_DISTANCE(t.vec_col, :qvec) - 查执行计划,确认
OPERATION列出现VECTOR INDEX RANGE SCAN,且OPTIONS含HNSW或INVERTED FILE - 开
ALTER SESSION SET EVENTS 'trace[vector]';抓底层向量操作日志,里面会明确打出using hnsw index from memory pool或reading ivf partition from disk
向量索引的物理管理核心就两点:HNSW死盯VECTOR_MEMORY_SIZE和V$VECTOR_MEMORY_POOL,IVF则老老实实当它是个特殊表空间对象来管。最容易忽略的是——索引建成了不等于用上了,得靠hint+执行计划双重验证。











