VECTOR_SEARCH(Transact-SQL)

适用于: SQL Server 2025 (17.x)Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

使用近似相邻向量搜索算法搜索类似于给定查询矢量的矢量。 若要详细了解矢量索引和矢量搜索的工作原理,以及精确搜索和近似搜索之间的差异,请参阅 SQL 数据库引擎中的矢量搜索和矢量索引。

重要

为了获得最佳性能并访问最新的矢量搜索功能,请使用使用最新版本创建的矢量索引。 有关升级现有索引和比较版本的更多信息,请参见 CREATE VECTOR INDEX ——将向量索引升级到最新版本。

功能可用性

  • 向量索引和VECTOR_SEARCH通常(GA)在Azure SQL 数据库中可用,SQL数据库在Microsoft Fabric,Azure SQL 托管实例始终 up-to日期更新策略。
  • 向量索引是VECTOR_SEARCH2025 SQL Server(17.x)和SQL Server 2025更新政策Azure SQL 托管实例预览功能。

警告

弃用通知: TOP_N 参数已 VECTOR_SEARCH 弃用,仅为了向后兼容早期版本向量索引而保留。 新的实现应改用 SELECT TOP (N) WITH APPROXIMATE 语法。 有关详细信息,请参阅 语法。

SQL Server 2025 预览功能

在 SQL Server 2025 和 SQL Server 2025更新策略中的 Azure SQL 托管实例 中,矢量索引和VECTOR_SEARCH函数处于预览阶段,可能会有变更。 若要使用此功能,必须启用 PREVIEW_FEATURES数据库范围的配置。

注释

向量索引的最新版本支持Azure SQL 数据库,SQL 数据库支持,Microsoft Fabric 版本,Azure SQL 托管实例 支持始终up-to日期更新策略。

最新矢量索引的关键增强功能

使用最新版本创建的矢量索引引入了重要的增强功能:

  • 完全 DML 支持:删除在创建索引后使矢量索引表只读的先前限制。 你现在可以在保持向量索引功能的同时,通过INSERT自动、实时的索引维护执行 、 UPDATE、 DELETEMERGE 和 操作
  • 迭代过滤:子句中的 WHERE 谓词在向量搜索过程中应用,而非检索后
  • 优化器驱动:查询优化器根据查询特征自动确定是使用 DiskANN 索引还是 kNN 搜索
  • 高级量化:矢量量化技术已集成,可提供更好的存储效率和更快的查询性能,这些优化对用户而言是透明的

Syntax

Transact-SQL 语法约定

使用最新版本的矢量索引:

重要

查询使用最新矢量索引版本的表时,近似矢量搜索必须使用 TOP (N) APPROXIMATE 语法。 这一语法要求表明查询明确要求近似最近邻结果。

SELECT TOP (N) WITH APPROXIMATE
    column_list
FROM VECTOR_SEARCH(
        TABLE = object [ AS source_table_alias ]
        , COLUMN = vector_column
        , SIMILAR_TO = query_vector
        , METRIC = { 'cosine' | 'dot' | 'euclidean' }
    ) [ AS result_table_alias ]
[ WHERE predicate ]
ORDER BY distance;

使用早期版本矢量索引:

VECTOR_SEARCH(
    TABLE = object [ AS source_table_alias ]
    , COLUMN = vector_column
    , SIMILAR_TO = query_vector
    , METRIC = { 'cosine' | 'dot' | 'euclidean' }
    , TOP_N = k
) [ AS result_table_alias ]

重要

最新版本矢量索引不支持此参数 TOP_N 。 使用上面所示的 SELECT TOP (N) WITH APPROXIMATE 语法。 有关详细信息,请参阅 使用旧语法时出错。

Arguments

TABLE = 对象 [AS source_table_alias]

执行搜索的表。 它必须是基表。 不支持视图、临时表(本地表和全局表)。

列 = vector_column

在其中执行搜索的向量列。 该列必须是 矢量 数据类型。

SIMILAR_TO = query_vector

用于搜索的向量。 它必须是 矢量 类型的变量或列。

METRIC = { 'cosine' |'dot' |'euclidean' }

用于计算查询向量与指定列中矢量之间的距离的距离指标。 仅当找到与同一个指标和同一列匹配的 ANN 索引时,才使用 ANN(近似近邻)索引。 如果没有兼容的 ANN 索引,则会引发警告,并使用 kNN (最接近邻居)算法。

TOP_N = <k>

警告

此参数已弃用,仅为了向后兼容早期版本向量索引而保留。 对于最新版本的索引,请改用 SELECT TOP (N) WITH APPROXIMATE 语法。 新实现应使用最新的语法。

必须返回的最大相似向量数。 它必须是正 整数。 使用最新版本创建的矢量索引不支持此参数。

result_table_alias

别名用于引用结果集。

返回结果集

函数返回 VECTOR_SEARCH 的结果集包括:

  • 参数中指定的 TABLE 表中的所有列。

  • 一个名为 distance的另一列,表示参数指定的 COLUMN 列中向量与参数中 SIMILAR_TO 提供的向量之间的距离。

距离列由 VECTOR_SEARCH 函数本身生成,而所有其他列都来自参数中引用的 TABLE 表。

如果使用参数中表的 TABLE 别名,则必须使用相同的别名来引用语句中的 SELECT 列。 不能使用分配给 VECTOR_SEARCH 引用表中指定 TABLE列的别名。 如果认为通过获取表数据的输出 VECTOR_SEARCH 并合并结果集,可以更轻松地理解此行为。

如果参数中指定的 TABLE 表已包含一 distance个名为列,该行为将类似于两个共享列名称的表之间的 SQL 联接。 在这种情况下,必须使用表别名来消除列引用的歧义,否则将引发错误。

重要

该 distance 列是近似矢量搜索结果的唯一有效排序键。

Limitations

  • 仅升序:列 distance 必须按升序排序(ASC)。 不支持降序(DESC)。

特定于版本的行为

行为 VECTOR_SEARCH 因矢量索引版本而异。

早期矢量索引版本

注释

这些限制仅适用于使用早期版本创建的矢量索引。 迁移到最新版本以启用迭代筛选。 请参阅 从早期矢量索引版本迁移。

仅筛选后:矢量搜索在应用任何谓词之前发生。 仅当返回最相似的向量后,才会应用其他谓词。 下面的示例返回与查询向量 @qv最相似的嵌入的前 10 行,然后应用子句中指定的 WHERE 谓词。 如果与矢量搜索返回的向量关联的 10 行中没有等于 accepted 1 的列,则结果为空。

SELECT TOP (10) s.id,
                s.title,
                r.distance
FROM VECTOR_SEARCH(
         TABLE = dbo.sessions AS s,
         COLUMN = embedding,
         SIMILAR_TO = @qv,
         METRIC = 'cosine',
         TOP_N = 10
     ) AS r
WHERE accepted = 1
ORDER BY r.distance;

一般限制

VECTOR_SEARCH 不能在视图正文中使用。

Examples

重要

查询使用最新矢量索引版本的表时,近似矢量搜索必须使用 TOP (N) WITH APPROXIMATE 语法。 这一语法要求表明查询明确要求近似最近邻结果。

以下示例查找表中与 10 个最相似的文章Pink Floyd music stylewikipedia_articles_embeddings。

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);

SELECT TOP (10) WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles_embeddings AS t,
        COLUMN = content_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
ORDER BY r.distance;

查询的语法取决于矢量索引版本:

矢量索引版本 语法示例
最新版本 不使用SELECT TOP (N) WITH APPROXIMATETOP_N参数
早期版本(已弃用) 在 TOP_N 函数中使用 VECTOR_SEARCH 参数

小窍门

若要确定矢量索引版本,请参阅 从早期矢量索引版本迁移。

对于早期版本索引(已弃用的语法):

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);

SELECT TOP (10)
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles_embeddings AS t,
        COLUMN = content_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine',
        TOP_N = 10  -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
    ) AS r
ORDER BY r.distance;

注释

将 TOP_N 参数与最新版本矢量索引结合使用将返回错误 Msg 42274。 有关详细信息,请参阅“预期行为”部分中 使用旧语法时 出错。

B. 创建索引时完成工作流

使用和相关CREATE VECTOR INDEX函数的基本端到端示例VECTOR_SEARCH。 将模拟嵌入内容。 在实际方案中,嵌入使用嵌入模型和 AI_GENERATE_EMBEDDINGS或 OpenAI SDK 等外部库生成。

注释

在创建索引之前,最新版本矢量索引至少需要 100 行数据。 此示例插入 100 行以满足此要求。 有关详细信息,请参阅 最低数据要求。

以下代码块演示 VECTOR_SEARCH 了具有模拟嵌入的函数:

  1. 启用预览功能(仅适用于 SQL Server 2025;在 Fabric 中不需要 Azure SQL 数据库或 SQL 数据库)。
  2. 使用数据类型dbo.Articles的列embedding创建示例表。
  3. 使用模拟嵌入数据插入 100 行示例数据。
  4. 在 . 上 dbo.Articles.embedding创建向量索引。
  5. 使用函数演示矢量相似性搜索 VECTOR_SEARCH 。
-- Step 0: Enable Preview Feature (SQL Server 2025 only)
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

-- Step 1: Create a sample table with a VECTOR(5) column
CREATE TABLE dbo.Articles
(
    id INT PRIMARY KEY,
    title NVARCHAR(100),
    content NVARCHAR(MAX),
    embedding VECTOR(5) -- mocked embeddings
);
GO

-- Step 2: Insert sample data (100 rows required for latest version indexes)
INSERT INTO Articles (id, title, content, embedding)
SELECT
    value AS id,
    'Article ' || [value],
    'Content for article ' || [value],
    CAST(JSON_ARRAY(
        CAST(value * 0.01 AS FLOAT),
        CAST(value * 0.02 AS FLOAT),
        CAST(value * 0.03 AS FLOAT),
        CAST(value * 0.04 AS FLOAT),
        CAST(value * 0.05 AS FLOAT)
    ) AS VECTOR(5))
FROM GENERATE_SERIES(1, 100);
GO

-- Step 3: Create a vector index on the embedding column
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (METRIC = 'cosine', TYPE = 'diskann');
GO

-- Step 4: Perform a vector similarity search
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3) WITH APPROXIMATE
    t.id,
    t.title,
    t.content,
    s.distance
FROM
    VECTOR_SEARCH(
        TABLE = Articles AS t,
        COLUMN = embedding,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS s
ORDER BY s.distance, t.title;

查询的语法取决于矢量索引版本:

矢量索引版本 语法示例
最新版本 不使用SELECT TOP (N) WITH APPROXIMATETOP_N参数
早期版本(已弃用) 在 TOP_N 函数中使用 VECTOR_SEARCH 参数

对于早期版本索引(已弃用的语法):

DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3)
    t.id,
    t.title,
    t.content,
    s.distance
FROM
    VECTOR_SEARCH(
        TABLE = Articles AS t,
        COLUMN = embedding,
        SIMILAR_TO = @qv,
        METRIC = 'cosine',
        TOP_N = 3  -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
    ) AS s
ORDER BY s.distance, t.title;

C. 使用迭代筛选进行矢量搜索

以下示例演示了使用最新版本矢量索引进行迭代筛选。 查询在搜索过程中应用谓词时查找类似的文章。

使用最新版本的索引时,WHERE 子句中的谓词在矢量搜索 过程中(而不是 之后)应用。 引擎一直搜索,直到找到与所有条件匹配的 5 个符合条件的行:

  • 矢量类似于“机器学习算法”
  • 类别等于“技术”
  • 已发布状态等于 1

这可以确保获取 5 个结果(如果存在),而无需手动调整搜索参数。 有关早期版本和最新版本之间的详细比较,请参阅“预期行为”部分中的 迭代筛选行为 。

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning algorithms' USE MODEL Ada2Embeddings);

SELECT TOP (5) WITH APPROXIMATE
    t.id,
    t.title,
    t.category,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = content_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
WHERE t.category = 'Technology'
  AND t.published = 1
ORDER BY r.distance;

注释

某些 SQL 操作(如 GROUP BY、聚合函数和窗口函数)需要子查询模式。 有关详细信息,请参阅 将矢量搜索与其他 SQL 操作组合在一起。

D. 具有 INNER JOIN 的多表联接

下面的示例演示了 INNER JOIN,并筛选了多个表。 嵌入存储在与主实体数据分开的表中时使用。

-- Assuming a schema with separate tables for articles and embeddings
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence and machine learning' USE MODEL Ada2Embeddings);

SELECT TOP (10) WITH APPROXIMATE
    a.id,
    a.title,
    a.category,
    vs.distance
FROM wikipedia_articles a
INNER JOIN VECTOR_SEARCH(
    TABLE = wikipedia_articles_embeddings AS e,
    COLUMN = content_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS vs ON a.id = e.article_id
WHERE e.approved = 1                           -- Iterative filter on embedding table
  AND a.category IN ('Technology', 'Science')  -- Filter on main table
  AND a.views > 50000
ORDER BY vs.distance;

此示例的主要功能:

  • 表别名范围: eTABLE = wikipedia_articles_embeddings AS e WHERE 子句中提供了别名,用于使用最新版本索引进行迭代筛选

预期行为

使用旧语法时出错

如果在查询具有最新版本矢量索引的表时尝试使用 TOP_N 参数 VECTOR_SEARCH ,SQL Server 将返回以下错误:

Msg 42274, Level 16, State 1
Vector search with version 3 index does not support explicit TOP_N parameter.

若要解决此错误:

  1. TOP_N从VECTOR_SEARCH函数中删除参数
  2. 改用 SELECT TOP (N) WITH APPROXIMATE 语法

不正确(生成最新版本索引时出错):

SELECT TOP (10) 
    t.id,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine',
        TOP_N = 10  -- This parameter causes the error with latest version indexes
    ) AS r;

正确(适用于最新版本索引):

SELECT TOP (10) WITH APPROXIMATE  -- Specify TOP and WITH APPROXIMATE here
    t.id,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
        -- No TOP_N parameter
    ) AS r
ORDER BY r.distance;

迭代筛选行为

最新版本对早期矢量索引版本进行了重大改进:

方面 早期版本 最新版本
谓词应用程序 在矢量搜索返回固定数量的近邻(仅筛选后)后应用关系谓词 关系谓词在矢量搜索过程中应用(迭代筛选)
结果完整性 如果初始最接近的邻居不满足筛选器,则查询可能会返回更少的行(或没有行),即使存在符合条件的行 查询在存在限定数据时返回预期的行数,而无需手动优化或查询重写
TOP (N) 优化 用户通常必须猜测或过度采样 TOP (N) 值来补偿筛选后 无需猜测 TOP (N) 值。 引擎搜索,直到找到足够的限定行或搜索空间耗尽
查询优化 不適用 SQL Server 自动选择最有效的执行策略,包括适当时在矢量索引查找和 kNN 扫描之间切换

有关迭代筛选的实际示例,请参阅 示例 C:使用迭代筛选进行矢量搜索。

ORDER BY 子句要求

使用 SELECT TOP (N) WITH APPROXIMATE时,ORDER BY 子句具有特定要求:

  • ORDER BY 必须存在:没有 ORDER BY 子句的查询失败并出现错误。
  • 仅允许距离列:ORDER BY 子句只能引用与VECTOR_SEARCH结果集之间的距离列。 包括其他列失败并出现错误。 若要按多个列排序,请使用 多个 ORDER BY 列中所述的子查询模式。
  • 仅升序:距离列必须按升序排序(ASC)。 不支持降序(DESC)。

有效的 ORDER BY:

SELECT TOP (10) WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance;  -- ✓ Valid

ORDER BY 模式无效:

-- Missing ORDER BY
SELECT TOP (10) WITH APPROXIMATE
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r;
-- ✗ Error Msg 42248: APPROXIMATE cannot be used in a query without ORDER BY

-- Multiple columns in ORDER BY
SELECT TOP (10) WITH APPROXIMATE
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance, t.title;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY 
-- on distance column ascending, and no other columns

-- Descending order
SELECT TOP (10) WITH APPROXIMATE
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r
ORDER BY r.distance DESC;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY 
-- on distance column ascending, and no other columns

没有向量索引的行为

VECTOR_SEARCH 即使目标列上不存在矢量索引,也可以执行查询。 如果没有索引,查询将执行完整表扫描(最接近邻居 (kNN) 搜索),以计算所有行的距离。

没有 TOP WITH APPROXIMATE 的查询行为

使用 VECTOR_SEARCH 时 SELECT TOP (N) WITH APPROXIMATE,查询行为取决于是否存在 TOP 和 ORDER BY 子句:

  • 无 TOP、无 ORDER BY 或 ORDER BY 非距离:计算并返回所有行的全表扫描(暴力搜索)
  • TOP (无近似值)与 ORDER BY 距离:作为 kNN(最接近邻居)搜索执行,这是最接近的邻居搜索

示例 - 使用距离列进行完全扫描:

-- Returns all rows with calculated distances
SELECT 
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.wikipedia_articles AS t,
    COLUMN = title_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS r
ORDER BY t.id;  -- Not ordering by distance

示例 - kNN 搜索(最接近的邻居):

-- Returns exact top 10 nearest neighbors using kNN
SELECT TOP (10)
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.wikipedia_articles AS t,
    COLUMN = title_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS r
ORDER BY r.distance;  -- No WITH APPROXIMATE = exact kNN

在 SELECT TOP (N) WITH APPROXIMATE 查询中使用不 VECTOR_SEARCH 带函数会导致错误。 该 WITH APPROXIMATE 子句要求存在函数 VECTOR_SEARCH 。

不正确 - 此查询失败:

-- Error: WITH APPROXIMATE requires VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
    id,
    title,
    VECTOR_DISTANCE('cosine', title_vector, @qv) AS distance
FROM dbo.wikipedia_articles
WHERE title_vector IS NOT NULL
ORDER BY VECTOR_DISTANCE('cosine', title_vector, @qv);

正确 - 使用VECTOR_SEARCH:

-- Correct: WITH APPROXIMATE with VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.wikipedia_articles AS t,
    COLUMN = title_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS r
ORDER BY r.distance;

TRUNCATE TABLE 限制

不能使用 TRUNCATE TABLE 截断具有矢量索引的表。 若要从矢量索引表中删除所有数据,

  1. 删除向量索引
  2. 截断表
  3. 使用至少 100 行重新填充表
  4. 重新创建向量索引

示例工作流:

-- Step 1: Drop the vector index
DROP INDEX idx_vector ON wikipedia_articles;

-- Step 2: Truncate the table
TRUNCATE TABLE wikipedia_articles;

-- Step 3: Repopulate with data (at least 100 rows)
-- ... insert operations ...

-- Step 4: Recreate the vector index
CREATE VECTOR INDEX idx_vector 
ON wikipedia_articles(title_vector)
WITH (METRIC = 'cosine');

可以将表提示与函数一起使用 VECTOR_SEARCH 来控制查询执行行为。 表 FORCE_ANN_ONLY 提示强制查询优化器仅使用近似近邻 (ANN) 索引,即使优化器可能选择其他执行策略也是如此。

语法:

FROM VECTOR_SEARCH(
    TABLE      = table_name,
    COLUMN     = column_name,
    SIMILAR_TO = vector_value,
    METRIC     = 'metric_name'
) AS alias WITH (FORCE_ANN_ONLY)

Example:

以下示例强制对矢量搜索查询使用近似近邻索引:

DECLARE @qembedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);

SELECT TOP 50 WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE      = dbo.wikipedia_articles AS t,
    COLUMN     = title_vector,
    SIMILAR_TO = @qembedding,
    METRIC     = 'cosine'
) AS r WITH (FORCE_ANN_ONLY)
ORDER BY r.distance;

如果要确保查询使用近似近邻索引策略,则使用 FORCE_ANN_ONLY ,替代优化器的自动策略选择。

注释

使用 FORCE_ANN_ONLY 需要两者:

  • 目标列上的向量索引
  • SELECT TOP (N) WITH APPROXIMATE 查询中的

如果缺少任一要求,查询将失败,因为它无法使用提示强制的近似邻近策略。

将矢量搜索与其他 SQL 操作组合在一起

VECTOR_SEARCH具有TOP (N) WITH APPROXIMATE其用法的特定要求的函数。 某些 SQL 操作可以直接用于矢量搜索,而另一些操作则需要子查询模式。

需要子查询模式的操作

如果需要执行不直接兼容的 TOP (N) WITH APPROXIMATE操作,请在子查询(内部查询)中使用矢量搜索,然后在外部查询中应用操作。 此模式维护近似矢量搜索的性能优势,同时启用完整的 SQL 功能。

小窍门

子查询模式适用于无法直接与 TOP (N) WITH APPROXIMATE.. 在内部查询中应用矢量搜索,然后在外部查询中使用任何 SQL 操作。

常见场景

下表列出了需要子查询模式的操作:

运算 示例用例
按组汇总 计算每个类别的统计信息
聚合函数 结果之间的总体 COUNT、AVG、MIN、MAX
窗口函数 ROW_NUMBER、RANK、DENSE_RANK、NTILE
设置运算 UNION、UNION ALL、EXCEPT、INTERSECT
多个 ORDER BY 列 按距离排序,然后按日期或标题排序
独特 删除重复的结果
交叉应用 从外部表应用每行矢量搜索

GROUP BY 和聚合函数

以下示例按类别查找最匹配项目的平均距离。 对于此示例,已将列 category 添加到 wikipedia_articles 表中以对项目进行分类。

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);

SELECT 
    category,
    COUNT(*) AS article_count,
    AVG(distance) AS avg_distance,
    MIN(distance) AS closest_match
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.title,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
GROUP BY category
ORDER BY avg_distance;

窗口函数

以下示例按相似性对文章进行排名,并分配四分位数。

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'neural networks' USE MODEL Ada2Embeddings);

SELECT 
    id,
    title,
    category,
    distance,
    ROW_NUMBER() OVER (ORDER BY distance) AS rank,
    NTILE(4) OVER (ORDER BY distance) AS quartile
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.title,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
WHERE distance < 0.5
ORDER BY rank;

设置操作(UNION、INTERSECT、EXCEPT)

以下示例使用 UNION 合并两个不同的搜索查询的结果。

DECLARE @qv1 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);
DECLARE @qv2 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);

SELECT id, title, 'AI Search' AS source
FROM (
    SELECT TOP (50) WITH APPROXIMATE
        t.id,
        t.title,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv1,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS ai_results

UNION

SELECT id, title, 'ML Search' AS source
FROM (
    SELECT TOP (50) WITH APPROXIMATE
        t.id,
        t.title,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv2,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS ml_results
ORDER BY id;

独特

以下示例从最匹配的文章中获取不同的类别。

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'deep learning' USE MODEL Ada2Embeddings);

SELECT DISTINCT category
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
WHERE distance < 0.7
ORDER BY category;

多个 ORDER BY 列

以下示例按距离排序,然后按标题进行关联。

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'quantum computing' USE MODEL Ada2Embeddings);

SELECT 
    id,
    title,
    category,
    distance
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.title,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
ORDER BY distance, title;

交叉应用

使用SELECT TOP (N) WITH APPROXIMATEVECTOR_SEARCH时,不能使用CROSS APPLY或OUTER APPLY在同一FROM子句中使用。 即使函数中 VECTOR_SEARCH 没有外部引用,也是如此。

具有 CROSS APPLY 逻辑的查询将执行多个矢量搜索(外部表中每行一行),并将所有结果合并到单个有序流中。 近似近邻算法无法有效地合并多个独立矢量搜索的结果,同时保持近似保证和性能特征。

生成错误的模式:

-- This query is NOT supported
SELECT TOP (100) WITH APPROXIMATE
    o.id,
    vs.title,
    vs.distance
FROM Orders AS o
    CROSS APPLY VECTOR_SEARCH(
        TABLE = Products,
        COLUMN = embedding,
        SIMILAR_TO = o.customer_preference_vector,
        METRIC = 'cosine'
    ) AS vs
WHERE o.order_date > '2026-01-01'
ORDER BY vs.distance;

此模式尝试查找每个订单的客户首选项的类似产品,但不能使用近似矢量搜索计划执行。

建议的模式:

若要获得类似的结果,请使用本身中的TOP (N) WITH APPROXIMATE子查询CROSS APPLY:

-- This query IS supported
SELECT
    o.id,
    vs.title,
    vs.distance
FROM Orders AS o
    CROSS APPLY (
        SELECT TOP (10) WITH APPROXIMATE
            p.title,
            r.distance
        FROM VECTOR_SEARCH(
            TABLE = Products AS p,
            COLUMN = embedding,
            SIMILAR_TO = o.customer_preference_vector,
            METRIC = 'cosine'
        ) AS r
        ORDER BY r.distance
    ) AS vs
WHERE o.order_date > '2026-01-01';

在此模式中:

  • 每个矢量搜索仅限于子查询中的前 10 个结果
  • 外部查询不使用 WITH APPROXIMATE
  • 结果在外部表中按行正确限定范围

直接工作的操作

无需子查询即可直接 VECTOR_SEARCH 使用以下操作: