导读:本期聚焦于赵六创作的《如何在Oracle数据库中实现向量存储与相似度搜索?》,敬请观看详情。为什么传统关系型数据库在处理文本、图像等非结构化相似匹配时效率不高?Oracle 23ai 引入 AI Vector Search 之后,开发者可以直接在表中定义 VECTOR 类型列,将 Embedding 向量与业务数据放在一起存储,并通过标准 SQL 完成余弦距离、欧氏距离或点积相似度检索。文章从建表与插入向量数据开始,介绍 HNSW 和 IVF 两类向量索引的创建方式及适用场景,再演示使用 vector_distance 函数进行 Top-K 相似结果查询的完整过程。相比外部向量数据库,这种原生能力省去了数据搬运,降低了系统复杂度,同时能够利用 Oracle 的事务、备份与安全机制。文中给出可运行的 SQL 示例,帮助你在 Oracle 23ai 环境中快速搭建最小向量搜索原型,为后续接入大模型语义检索或推荐系统打基础。

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

如何在Oracle数据库中实现向量存储与相似度搜索?

原生向量类型:从建表到写入

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 来计算两个向量之间的距离。该函数可以指定距离度量,例如 COSINEEUCLIDEANDOTMANHATTAN 等。相似度搜索的典型写法是按照距离升序排列,再使用 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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。