Oracle 23ai 中如何运用向量距离函数完成相似度检索?

来源:NoSQL教程作者:狼行天下头衔:草根站长
导读:本期聚焦于狼行天下创作的《Oracle 23ai 中如何运用向量距离函数完成相似度检索?》,敬请观看详情。Oracle 23ai 的向量引擎把高维向量的距离计算直接下沉到 SQL 内核,这让相似图片、语义文本、推荐系统等场景不必再依赖外部向量库。VECTOR_DISTANCE 函数支持余弦距离、欧氏距离、点积距离和曼哈顿距离等多种度量方式,可以直接在 SELECT 或 WHERE 子句中调用。使用时需要关注向量维度一致、距离类型选择以及性能开销。对于大规模数据,建议配合 HNSW 或 IVF 向量索引,将近似最近邻搜索交给优化器自动路由。本文通过建表、插入数据、执行距离排序和索引加速几个步骤,说明这些函数和运算的实际用法及常见误区。

Oracle 23ai 将向量检索能力直接集成到关系型数据库中,VECTOR_DISTANCE 函数成为实现语义搜索、图像相似匹配和推荐系统的核心工具。它不再要求应用把向量数据导入专用的向量数据库,而是在同一条 SQL 语句中完成距离计算、排序、过滤和连接操作。理解这些距离函数与运算规则,有助于在混合查询场景中兼顾开发效率和执行性能。

Oracle 23ai 中如何运用向量距离函数完成相似度检索?

一、VECTOR_DISTANCE 函数的基本语法与度量选择

VECTOR_DISTANCE 函数接受两个向量参数和一个可选的距离类型参数,返回一个数值表示两者之间的距离或相似度损失。在 Oracle 23ai 中,向量列可以使用 VECTOR 数据类型定义,例如 VECTOR(3, FLOAT64) 表示维度为 3、元素类型为 64 位浮点数的向量。函数的基本调用形式为 VECTOR_DISTANCE(vector1, vector2, metric),其中 metric 可以省略,默认采用创建向量索引时指定的距离度量,否则通常需要显式指定。

可用的距离度量包括 COSINEEUCLIDEANDOTMANHATTAN。余弦距离衡量两个向量方向的差异,取值范围在 0 到 2 之间,0 表示方向完全一致,2 表示方向完全相反。欧氏距离衡量向量终点的直线距离,值越小表示越相似。曼哈顿距离计算各维度绝对差之和,适合高维稀疏场景中的粗过滤。点积距离在 Oracle 中返回负的点积结果,因此点积越大,函数返回值越小,这与其他距离保持越小越相似的一致语义。

下面的 SQL 创建一个商品向量表,并插入三条三维向量数据作为测试基础:

CREATE TABLE product_vectors (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(200),
    embedding VECTOR(3, FLOAT64)
);

INSERT INTO product_vectors VALUES (1, '商品A', '[0.1, 0.2, 0.3]');
INSERT INTO product_vectors VALUES (2, '商品B', '[0.2, 0.3, 0.4]');
INSERT INTO product_vectors VALUES (3, '商品C', '[0.8, 0.9, 0.7]');

执行一个简单的距离查询,查看所有商品与查询向量 [0.15, 0.25, 0.35] 的余弦距离:

SELECT id,
       name,
       VECTOR_DISTANCE(embedding, '[0.15, 0.25, 0.35]', COSINE) AS similarity_loss
FROM product_vectors
ORDER BY similarity_loss;

二、在 SQL 查询中组合向量距离与业务条件

向量距离函数最有价值的地方在于它能和传统关系条件无缝组合。比如需要从商品表中找出与查询向量相似,同时库存大于 10 且状态为上架的前 5 个商品,可以直接使用一条 SQL 完成。排序时通常将距离结果按升序排列,并将 FETCH FIRSTROWNUM 用于限制返回行数。对于需要阈值过滤的场景,可以把 VECTOR_DISTANCE 放在 WHERE 子句中,但要注意低基数的关系过滤条件可能影响向量索引的选择。

下面示例同时使用余弦距离排序和库存条件过滤:

SELECT id,
       name,
       VECTOR_DISTANCE(embedding, :query_vector, COSINE) AS distance
FROM product_vectors
WHERE stock > 10
  AND status = 'ON_SALE'
ORDER BY distance
FETCH FIRST 5 ROWS ONLY;

示例中 stock > 10 的条件在数据库客户端写入时使用大于号即可,这里为了符合 HTML 展示规范做了转义。查询向量通常通过绑定变量传入,避免在 SQL 文本中反复拼接大段数组字面量。对于点积距离,业务上可能希望点积越大越相似,因此排序时需要按距离升序,因为 DOT 距离返回的是负点积。

另一个常见做法是连接两张表,例如用户向量表和内容向量表,通过距离函数计算用户与未读内容的匹配度。由于 VECTOR_DISTANCE 可以出现在 ONWHERE 条件中,这种相似度连接在 Oracle 23ai 中并不需要将数据导出到外部计算引擎。

三、使用向量索引加速距离运算

当向量数据达到数十万甚至上亿行时,对每一行执行精确距离计算会让查询变慢。Oracle 23ai 提供 HNSWIVF 两类向量索引,支持近似最近邻搜索。创建向量索引时声明距离度量,并设置目标精度,Oracle 优化器会在查询中使用该索引来减少需要精确计算距离的候选行数。

创建一个基于余弦距离的 HNSW 向量索引:

CREATE VECTOR INDEX product_vec_hnsw
ON product_vectors(embedding)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE
WITH TARGET ACCURACY 95;

索引创建完成后,前面的相似度查询可能会自动走向量索引。执行计划中可以看到近似最近邻访问路径,而不是全表扫描。需要注意的是,WHERE 子句中的非向量过滤条件如果选择性很高,优化器可能选择先过滤再精确计算距离,不一定使用向量索引。此时可以调整查询写法或使用提示影响执行计划。

如果数据量极大且允许一定的召回损失,可以将 TARGET ACCURACY 设置为较低值,例如 80,以换取更高的查询速度。相反,对召回率要求高的搜索场景,应设置 98 或更高精度,并适当增加内存和构建时间。索引距离度量必须与查询中的 VECTOR_DISTANCE 使用的度量一致,否则索引无法被应用,系统会退化为精确扫描。

四、距离运算中的常见误区与优化建议

向量距离计算对维度一致性要求严格。参与计算的两个向量维度必须相同,否则 Oracle 会抛出错误。例如使用 VECTOR(3, FLOAT64) 存储三维向量,却传入四维查询向量,直接报错。生成向量时应统一模型输出维度,并在表结构中明确声明,避免运行时才发现不兼容。

另一个误区是把相似度分数和距离混淆。余弦距离为 0 表示最相似,而余弦相似度通常为 1 表示最相似。在应用层展示分数时,如果直接把距离结果当相似度使用,排序会完全相反。对于需要相似度分数的场景,可以手工转换为 1 - cosine_distance 或使用点积结果。

批量查询时建议使用绑定变量和批处理,不要为每一行拼接字符串。对超大规模向量表,除了依赖索引,还可以通过分区裁剪和结果缓存减少重复计算。Oracle 23ai 的 VECTOR_DISTANCE 可以与并行查询、物化视图等特性配合,但需要测试具体场景下优化器的选择是否合理。

整体来看,Oracle 23ai 的向量距离函数把相似度计算变成了一种普通的 SQL 运算,使得关系数据和向量数据能够在同一事务中处理。设计查询时优先考虑距离度量与索引匹配、维度一致性以及过滤条件的组合方式,可以避免大多数性能问题,并充分发挥数据库内置向量搜索的价值。

Oracle 23ai向量距离函数相似度运算修改时间:2026-08-20 03:25:40

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