首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SQL:2028 将定义 vector 标准?

SQL:2028 将定义 vector 标准?

作者头像
用户4035096
发布2026-07-09 18:23:23
发布2026-07-09 18:23:23
110
举报

SQL:2028 将定义 vector 标准?

SQL标准多少年会发一个版本?

最新版本SQL:2023中没有定义向量的标准, 但几乎所有的SQL数据库都已经支持了vector, 如果各家数据库的使用方式标准不统一, 对应用开发者来说其实是很不友好的.

下面是数据库老司机peter( https://github.com/petere )对SQL:202y标准中向量定义的展望, 以下内容翻译自: https://peter.eisentraut.org/blog/2025/06/24/waiting-for-sql-202y-vectors

自SQL:2023 ( https://peter.eisentraut.org/blog/2023/06/01/sql-2023-is-out )发布以来已经有一段时间了,SQL 标准的制定工作仍在继续。如今,数据库领域的每个人都想要向量,而很多数据库现在也支持了向量。

(我使用术语“SQL:202y”表示“SQL:2023 之后的下一个 SQL 标准”。我从C 标准( https://thephd.dev/5-years-later-the-first-big-unicode-win-omg-yay )中借用了这个命名约定,但它不是 SQL 标准的官方术语。目前的时间表建议在 2028 年发布新版本,但我们拭目以待。)

vector 是目前数据库领域的热门话题,与LLM 和“人工智能”用例相关。关于向量(vector)的信息有很多,这里我将尽量简化,仅描述新的 SQL 特性。其基本思想是,表中有一些关系数据,比如文本产品描述或图像。然后,你将这些数据通过某种embedding方式 (SQL 目前尚未涵盖这部分内容) —— 得到(转换为)一个向量。其思想是,在数学上彼此接近的向量表示语义上相似的数据。因此,以前应用程序可能仅通过字符串相等模式匹配全文搜索来搜索“匹配”的内容,而现在可以进行语义匹配。许多数据库管理系统现在都增加了对这种功能的支持,因此有必要对一些通用部分进行标准化。

因此,SQL 中现在有一个新的数据类型称为 vector

代码语言:javascript
复制
CREATE TABLE items (  
    id int PRIMARY KEY,  
    somedata varchar,  
    embedding vector(100, integer)  
);  

该vector类型接受两个参数:维度计数和坐标类型。坐标类型可以是现有的数值类型,也可以是实现定义的其他关键字之一。例如,实现可能选择支持具有 float16 内部值的向量。

PS: digoal注解, 其实用数组更好定义, float[100] 就是 100维、每个维用float表示的向量.

以下是如何将数据插入此类型:

代码语言:javascript
复制
INSERT INTO items VALUES (1, 'foo', vector('[1,2,3,4,5,...]', 100, integer));  

构造函数vector()采用实际矢量数据的序列化以及维度计数和坐标类型。

再次强调,如何实际生成该向量(就是embedding操作)的数据并不是 SQL 标准的一部分。

有一些可用于操作此类型的实用函数,我不会详细介绍它们:

代码语言:javascript
复制
vector_dimension_count()  
vector_norm()  
vector_serialize()  

人们使用向量的主要目的是比较它们与其他向量的相似度,然后按相似度排序。计算向量相似度的方法(就是向量距离算法, 不同算法应用于不同的业务场景)有很多种,SQL 支持其中几种:

  • cosine
  • dot
  • euclidean
  • euclidean_squared
  • hamming
  • manhattan

它们被用作函数的一部分vector_distance(),例如:

代码语言:javascript
复制
SELECT *, vector_distance(items.embedding, :someparam, cosine) FROM items ...  

(这里,:someparam 表示应用程序给出的查询参数。)

通常,您要对向量距离进行的操作不是直接查看它,而是按距离排序:

代码语言:javascript
复制
SELECT * FROM items ...  
  ORDER BY vector_distance(items.embedding, :someparam, cosine)  

通常你想要前 N 个相似结果:

代码语言:javascript
复制
SELECT * FROM items ...  
  ORDER BY vector_distance(items.embedding, :someparam, cosine)  
  FETCH FIRST 10 ROWS ONLY  

(某些 SQL 实现 FETCH FIRST 可能也称之为 LIMIT。)

处理向量的一个特殊之处在于,人们通常对近似结果感到满意。如果你运行类似“按销售额排序,显示排名前十的部门”这样的查询,你肯定想要精确的结果。但如果你执行基于向量的查询,例如“按顺序,给出‘绿色衬衫’的 10 个最接近的匹配项”,你只需要一个足够好、快速的结果,并由某种向量索引支持,该索引能够提供一定程度的足够好和快速的结果。然后,人们会使用诸如召回率之类的术语来评判结果的好坏。

索引本身不属于 SQL 标准,因此你也不会在其中看到任何关于向量索引、HNSW、ivfflat或其他内容的处理。这取决于具体的实现。

SQL 目前还没有近似结果的概念(尽管 TABLESAMPLE 有点像)。为了解决这个问题,该FETCH FIRST子句新增了一个关键字APPROX,用于选择近似结果:

代码语言:javascript
复制
SELECT * FROM items ...  
  ORDER BY vector_distance(items.embedding, :someparam, cosine)  
  FETCH APPROX FIRST 10 ROWS ONLY  

(相反的关键字是EXACT。)实际上,您可能不需要看到这一点,因为规则还规定,如果在查询中使用向量类型,那么APPROX就是默认值。

作为附加扩展,您现在还可以指定一个范围作为近似限制,例如:

代码语言:javascript
复制
SELECT * FROM items ...  
  ORDER BY vector_distance(items.embedding, :someparam, cosine)  
  FETCH APPROX FIRST 5 TO 10 ROWS ONLY  

这将确保您获得 5 到 10 行之间的数据。(或 limit 5 offset 5)

目前就这些了。SQL 标准仍在开发中,还有其他功能正在开发中,我可能会在其他时间撰写相关文章。在此期间,您也可以发表评论并提供反馈。如果您无法访问 ISO 官方渠道,请随时在此处发表评论或直接联系我。

看到这, 你有什么想说的?

反正我觉得pgvector就非常人性化,根本原因可能要感谢PG的开放性设计,让新增operator, INDEX融入已经非常丝滑.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 digoal德哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SQL:2028 将定义 vector 标准?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档