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:
CREATE TABLE items (
id int PRIMARY KEY,
somedata varchar,
embedding vector(100, integer)
);
该vector类型接受两个参数:维度计数和坐标类型。坐标类型可以是现有的数值类型,也可以是实现定义的其他关键字之一。例如,实现可能选择支持具有 float16 内部值的向量。
PS: digoal注解, 其实用数组更好定义, float[100] 就是 100维、每个维用float表示的向量.
以下是如何将数据插入此类型:
INSERT INTO items VALUES (1, 'foo', vector('[1,2,3,4,5,...]', 100, integer));
构造函数vector()采用实际矢量数据的序列化以及维度计数和坐标类型。
再次强调,如何实际生成该向量(就是embedding操作)的数据并不是 SQL 标准的一部分。
有一些可用于操作此类型的实用函数,我不会详细介绍它们:
vector_dimension_count()
vector_norm()
vector_serialize()
人们使用向量的主要目的是比较它们与其他向量的相似度,然后按相似度排序。计算向量相似度的方法(就是向量距离算法, 不同算法应用于不同的业务场景)有很多种,SQL 支持其中几种:
它们被用作函数的一部分vector_distance(),例如:
SELECT *, vector_distance(items.embedding, :someparam, cosine) FROM items ...
(这里,:someparam 表示应用程序给出的查询参数。)
通常,您要对向量距离进行的操作不是直接查看它,而是按距离排序:
SELECT * FROM items ...
ORDER BY vector_distance(items.embedding, :someparam, cosine)
通常你想要前 N 个相似结果:
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,用于选择近似结果:
SELECT * FROM items ...
ORDER BY vector_distance(items.embedding, :someparam, cosine)
FETCH APPROX FIRST 10 ROWS ONLY
(相反的关键字是EXACT。)实际上,您可能不需要看到这一点,因为规则还规定,如果在查询中使用向量类型,那么APPROX就是默认值。
作为附加扩展,您现在还可以指定一个范围作为近似限制,例如:
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融入已经非常丝滑.