Oracle 从 23ai 版本开始正式提供 AI Vector Search 能力,允许在关系表中使用原生 VECTOR 数据类型保存向量,并通过标准 SQL 进行相似度查询。无论是文本语义检索、图像搜索还是推荐系统,向量存储与相似度搜索都正在成为核心数据访问方式。本文基于 Oracle 23ai Free 或企业版环境,详细介绍向量表的创建、向量索引的构建以及相似度 SQL 的写法,帮助读者在一个数据库实例内完成从向量写入到近似最近邻搜索的完整闭环。

原生向量类型:从建表到写入
Oracle 的 AI Vector Search 首先提供一个专门的 VECTOR 数据类型,用来表示固定长度的浮点数数组。定义列时需要指定维度,以及每个维度的数值精度,例如 VECTOR(3, FLOAT32) 表示三维 FLOAT32 向量,VECTOR(768, FLOAT64) 表示 768 维双精度向量。维度通常与 Embedding 模型的输出维度保持一致,常见的有 384、512、768、1024、1536 等。把向量列直接放在业务表中,意味着向量数据和文章内容、用户信息或商品属性可以存储在同一行,后续查询时不需要跨系统关联,事务性操作也更加自然。
下面是一个最小化的建表示例。表 product_catalog 包含商品 ID、商品名称、描述文本以及描述文本对应的向量列。向量列建议使用 FLOAT32 精度,因为大多数 Embedding 模型输出的是 32 位浮点数,既能满足相似度计算的精度要求,又能显著降低存储和内存占用。
CREATE TABLE product_catalog (
product_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
product_name VARCHAR2(200),
description CLOB,
description_vector VECTOR(768, FLOAT32)
);插入向量数据时,可以使用字符串形式直接表示数组,Oracle 会自动将其转换为 VECTOR 类型。字符串内使用方括号包裹数值,数值之间用逗号分隔。下面语句插入一条商品记录,并写入一个简化示例向量。实际生产环境中,向量通常由应用层调用大模型 API 生成,再作为绑定参数传入 INSERT 语句。
INSERT INTO product_catalog (product_name, description, description_vector)
VALUES (
'无线降噪耳机',
'支持主动降噪、蓝牙 5.3 和 30 小时续航',
'[0.012, -0.034, 0.088, ... 其余 765 个维度省略]'
);需要注意,向量字符串的总长度不能超过 VECTOR 类型所允许的最大大小。对于 768 维 FLOAT32 向量,字符串通常只有几 KB,对 SQL 执行没有明显压力。如果向量来自外部模型,建议在应用层将 Embedding 结果转成标准数组格式后再写入,避免在 SQL 中编写复杂字符串处理逻辑。维度不匹配是向量写入阶段最常见的错误,例如列定义为 768 维,但实际传入 1536 维,数据库会直接报错,因此接入时需要增加维度校验。
向量索引:HNSW 与 IVF 的取舍
小规模数据可以直接通过全表扫描计算所有行的向量距离,但对于百万或千万级别的向量数据,暴力扫描的查询延迟会急剧上升。Oracle 提供两类近似最近邻索引:HNSW 和 IVF。HNSW 全称为 Hierarchical Navigable Small World,通过多层图结构组织向量节点,搜索时从高层快速定位到可能区域,再在低层精细查找。它查询精度高、延迟低,但构建索引和内存消耗相对较高。IVF 全称为 Inverted File,先通过聚类将向量空间划分成多个簇,查询时只扫描与目标向量最接近的若干个簇,从而减少距离计算次数。IVF 更适合数据量非常大且对内存敏感的场景。
创建 HNSW 索引时,可以指定距离度量和构建参数。例如下面语句在 description_vector 列上创建 HNSW 索引,使用余弦距离,邻居数量为 32,构建阶段扩展候选集为 200。如果没有特别指定距离度量,默认使用欧氏距离。索引创建完成后,DML 操作会自动维护向量索引,但会带来一定的写入放大,这是所有向量索引的共性。
CREATE VECTOR INDEX product_vector_hnsw_idx ON product_catalog (description_vector) ORGANIZATION INMEMORY NEIGHBOR GRAPH DISTANCE COSINE WITH TARGET ACCURACY 95 PARAMETERS (NEIGHBORS 32, EFCONSTRUCTION 200);
IVF 索引的创建语法有所不同,需要指定聚类簇数以及训练方式,Oracle 会先对向量数据进行训练,再构建倒排列表。通常簇数越多,搜索时需要扫描的簇越多,精度越高,但速度也越慢。对于生产系统,建议先使用小规模数据同时创建 HNSW 和 IVF 索引做基准测试,对比召回率、QPS 和内存占用后再做决定。HNSW 在绝大多数中等规模场景下体验更好,而 IVF 在大规模且资源受限的场景中仍有明显优势。Oracle 还支持对带有向量索引的表进行分区,从而提高超大表的管理效率。
用 SQL 完成相似度搜索
Oracle 提供内置函数 vector_distance 来计算两个向量之间的距离。该函数可以指定距离度量,例如 COSINE、EUCLIDEAN、DOT、MANHATTAN 等。相似度搜索的典型写法是按照距离升序排列,再使用 FETCH FIRST N ROWS ONLY 返回 Top-K 结果。如果使用余弦距离,距离值越小表示两个向量越相似;如果使用点积,则值越大表示越相似,排序时需要用降序。下面示例根据一个查询向量找出最相似的 5 个商品。
SELECT product_id,
product_name,
vector_distance(description_vector, :query_vector, COSINE) AS similarity_distance
FROM product_catalog
ORDER BY similarity_distance
FETCH FIRST 5 ROWS ONLY;这里使用了绑定变量 :query_vector,可以在应用层传入查询文本对应的向量。Oracle 优化器如果发现查询按距离排序且距离函数匹配向量索引,会自动优先使用 HNSW 或 IVF 索引执行近似搜索,并且可以在参数中调整近似精度。例如使用 APPROXIMATE 搜索时可以通过 hint 或会话参数控制扫描范围,在速度与精度之间做权衡。对于精确搜索,可以禁用索引或使用 EXACT 提示,但精确搜索通常只适合数据量较小的场景。
向量搜索还可以与普通关系谓词混合使用。例如先按商品类目过滤,再在过滤结果中按向量距离排序;或者限定库存大于零的商品,执行向量搜索。这类混合查询让 Oracle 在同一执行计划中同时应用 B-tree 索引和向量索引,避免了将数据搬到外部向量库后难以联合过滤的问题。对于需要同时返回结构化字段和相似度得分的业务接口,一条 SQL 就能完成,极大简化了应用端代码。现实项目中,还可以在查询中使用 ROWNUM 或窗口函数做二次加工,生成分页结果。
构建 Embedding 与生产落地建议
向量本身不是凭空产生的,通常由 Embedding 模型对文本、图像或用户行为序列进行编码后获得。常见做法是在应用服务中调用 OpenAI、Cohere、HuggingFace 等模型 API,或者使用本地部署的 Sentence-Transformers 模型,将对象转换为向量数组。得到向量后,应用通过 JDBC、Oracle Data Provider for .NET 或 Node.js 驱动将向量绑定到 SQL 语句中。Oracle 23ai 还提供 OML Services,允许在数据库内部直接调用 ONNX 格式模型完成向量生成,不过这种方式需要提前将模型转换成 ONNX 并导入数据库。
生产环境中,建议对所有业务对象统一 Embedding 模型和向量维度,否则不同来源的向量混合存储会失去可比性。如果使用余弦距离,最好在写入前对向量做 L2 归一化,这样向量模长不会影响距离计算。对于大批量初始化导入,可以使用批量插入或 SQL*Loader,并在导入完成后重建向量索引,比逐行插入加实时维护索引要快很多。实时写入场景则需要评估向量索引的维护代价,必要时采用异步刷新或分批提交策略。
当数据量增长到数千万甚至上亿时,单表向量搜索仍然可能遇到性能瓶颈。此时可以考虑按业务维度对表进行分区,例如按时间、地区或商品类目拆分,并在每个分区上单独建立向量索引。应用查询时先根据业务条件定位到少量分区,再执行向量搜索,从而减少单次查询需要扫描的向量数量。Oracle 的并行查询和 In-Memory 列式存储也可以进一步提升向量距离计算吞吐。总体而言,Oracle 的向量存储与相似度搜索方案适合那些已经使用 Oracle 数据库,并且希望减少系统组件、简化数据架构的团队。
Oracle Embedding向量存储相似度搜索修改时间:2026-08-20 19:07:45