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

一、VECTOR_DISTANCE 函数的基本语法与度量选择
VECTOR_DISTANCE 函数接受两个向量参数和一个可选的距离类型参数,返回一个数值表示两者之间的距离或相似度损失。在 Oracle 23ai 中,向量列可以使用 VECTOR 数据类型定义,例如 VECTOR(3, FLOAT64) 表示维度为 3、元素类型为 64 位浮点数的向量。函数的基本调用形式为 VECTOR_DISTANCE(vector1, vector2, metric),其中 metric 可以省略,默认采用创建向量索引时指定的距离度量,否则通常需要显式指定。
可用的距离度量包括 COSINE、EUCLIDEAN、DOT 和 MANHATTAN。余弦距离衡量两个向量方向的差异,取值范围在 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 FIRST 或 ROWNUM 用于限制返回行数。对于需要阈值过滤的场景,可以把 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 可以出现在 ON 或 WHERE 条件中,这种相似度连接在 Oracle 23ai 中并不需要将数据导出到外部计算引擎。
三、使用向量索引加速距离运算
当向量数据达到数十万甚至上亿行时,对每一行执行精确距离计算会让查询变慢。Oracle 23ai 提供 HNSW 和 IVF 两类向量索引,支持近似最近邻搜索。创建向量索引时声明距离度量,并设置目标精度,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