创建矢量索引(Transact-SQL)(预览)

适用于: SQL Server 2025 (17.x) Azure SQL DatabaseSQL database in Microsoft Fabric

在向量列上创建近似索引,以提高最接近邻居搜索的性能。 若要详细了解矢量索引和矢量搜索的工作原理,以及精确搜索和近似搜索之间的差异,请参阅 SQL 数据库引擎中的矢量搜索和矢量索引

Azure SQL 数据库与 Fabric 中的 SQL 数据库

该功能目前处于预览阶段。 在使用之前,请确保先查看 当前限制

注释

作为预览版功能,本文中介绍的技术受制于 Microsoft Azure 预览版补充使用条款

SQL Server 2025 预览功能

在 SQL Server 2025 中,该功能处于预览阶段,可能会有变更。 若要使用此功能,必须启用 PREVIEW_FEATURES数据库范围的配置

在使用之前,请确保先查看 当前限制

语法

Transact-SQL 语法约定

CREATE VECTOR INDEX index_name
ON object ( vector_column )
[ WITH (
    [ , ] METRIC = { 'cosine' | 'dot' | 'euclidean' }
    [ [ , ] TYPE = 'DiskANN' ]
    [ [ , ] MAXDOP = max_degree_of_parallelism ]
) ]
[ ON { filegroup_name | "default" } ]
[;]

论据

index_name

索引的名称。 索引名称在表中必须唯一,但不必在数据库中是唯一的。 索引名称必须遵循 标识符规则。

对象

在其中创建索引的表。 它必须是基表。 不支持视图、临时表(本地表和全局表)。

vector_column

用于创建向量索引的列。 它必须是 矢量 类型。

度量

一个字符串,其中包含用于计算两个给定向量之间的距离的距离指标的名称。 支持以下距离指标:

  • cosine - 余弦距离
  • euclidean - Euclidean 距离
  • dot - (负数) 点积

TYPE

用于生成索引的 ANN 算法 的类型。 目前仅支持 DiskANN。 DiskANN 是默认值。

MAXDOP

替代索引作的 最大并行度 配置选项。 有关详细信息,请参阅 服务器配置:最大并行度。 使用 MAXDOP 来限制索引生成作的并行度和生成的资源消耗。

max_degree_of_parallelism 可以是:

  • 1

    取消生成并行计划。

  • >1

    根据当前系统工作负荷,将并行索引作中使用的最大并行度限制为指定数目或更少。

  • 0(默认值)

    使用在服务器、数据库或工作负荷组级别指定的并行度,除非根据当前系统工作负荷减少。

有关详细信息,请参阅 配置并行索引作

注释

并行索引操作并不适用于 SQL Server 的所有版本。 有关各版本支持的功能列表,请参见“ SQL Server 2022 的版本及支持特性 ”或 “SQL Server 2025 的版本与支持功能”。

局限性

当前预览版具有以下限制:

  • 无法对矢量索引进行分区。 不支持分区。

  • 该表必须具有单个列、整数、主键聚集索引。

  • 矢量索引不会复制到订阅服务器。

  • 具有向量索引的表变为只读。 当表上存在向量索引时,不允许进行任何数据修改。

    在 Azure SQL 数据库和 Microsoft Fabric 中的 SQL 数据库中,你可以将ALLOW_STALE_VECTOR_INDEX设置为 ON ,这样表又可以重新编写。

    注释

    ALLOW_STALE_VECTOR_INDEX数据库范围配置选项目前在 SQL Server 2025(17.x)中不可用。

    当表格中插入或更新新数据时,向量索引不会被更新。 要刷新向量索引,必须丢弃并重新创建它。

已知问题

有关详细信息,请查看 已知问题

权限

用户必须对表具有 ALTER 权限。

例子

可在此处找到示例中使用的数据库的详细信息: 使用 Vector Embedding 下载并导入维基百科文章

示例假定存在一个表,该表具有wikipedia_articles存储标题的维基百科文章嵌入的类型title_vectorvectortitle_vector 假设是使用嵌入模型(如 text-embedding-ada-002文本嵌入-3-small)生成的嵌入,该模型返回具有 1,536 个维度的矢量。

有关更多示例(包括端到端解决方案),请转到 Azure SQL 数据库矢量搜索示例 GitHub 存储库

示例 1

以下示例使用title_vector指标对cosine列创建向量索引。

CREATE VECTOR INDEX vec_idx
    ON [dbo].[wikipedia_articles] ([title_vector])
        WITH (METRIC = 'COSINE', TYPE = 'DISKANN');

示例 2

以下示例使用 (负) title_vector 产品指标对dot列创建向量索引,将并行度限制为 8,并将向量SECONDARY存储在文件组中。

CREATE VECTOR INDEX vec_idx
    ON [dbo].[wikipedia_articles] ([title_vector])
        WITH (METRIC = 'DOT', TYPE = 'DISKANN', MAXDOP = 8)
    ON [SECONDARY];

示例 3

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

以下代码块使用以下步骤创建模拟嵌入:

  1. 启用当前预览版中必需的跟踪标志。
  2. 使用数据类型dbo.Articles的列embedding创建示例表
  3. 使用模拟嵌入数据插入示例数据。
  4. 在 . 上 dbo.Articles.embedding创建向量索引。
  5. 使用函数演示矢量相似性搜索 VECTOR_SEARCH()
-- Step 0: Enable Preview Feature
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
);

-- Step 2: Insert sample data
INSERT INTO Articles (id, title, content, embedding)
VALUES
(1, 'Intro to AI', 'This article introduces AI concepts.', '[0.1, 0.2, 0.3, 0.4, 0.5]'),
(2, 'Deep Learning', 'Deep learning is a subset of ML.', '[0.2, 0.1, 0.4, 0.3, 0.6]'),
(3, 'Neural Networks', 'Neural networks are powerful models.', '[0.3, 0.3, 0.2, 0.5, 0.1]'),
(4, 'Machine Learning Basics', 'ML basics for beginners.', '[0.4, 0.5, 0.1, 0.2, 0.3]'),
(5, 'Advanced AI', 'Exploring advanced AI techniques.', '[0.5, 0.4, 0.6, 0.1, 0.2]');

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

-- Step 4: Perform a vector similarity search
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT
    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
    ) AS s
ORDER BY s.distance, t.title;