CREATE VECTOR INDEX (Transact-SQL)

SQL Server 2025 (17.x) 预览版

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

预览功能

注释

此功能以预览版提供,可能会更改。 请务必阅读 联机服务的服务级别协议(SLA)中的预览使用条款。

此功能处于预览状态。 若要使用此功能,必须启用以下 跟踪标志

DBCC TRACEON(466, 474, 13981, -1)

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

语法

Transact-SQL 语法约定

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

论据

index_name

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

对象

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

vector_column

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

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

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

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

TYPE = 'DiskANN'

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

MAXDOP = max_degree_of_parallelism

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

max_degree_of_parallelism 可以是:

  • 1

    取消生成并行计划。

  • >1

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

  • 0(默认值)

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

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

注释

Microsoft SQL Server 的每个版本中都不提供并行索引作。 有关 SQL Server 各版本支持的功能列表,请参阅 SQL Server 2022 或版本支持的版本和支持的功能以及 SQL Server2025 预览版支持的功能

DROP_EXISTING = { ON |OFF }

使用修改后的规范删除和重新生成现有向量索引的选项,并为索引保留相同的名称。 默认值为 OFF

  • ON

    指定删除并重新生成现有索引,该索引必须与 index_name 参数具有相同名称。

  • OFF

    指定不删除和重新生成现有索引。 如果指定的索引名称已存在,SQL Server 将显示错误。

局限性

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

  • 不支持分区。 无法对矢量索引进行分区。
  • 该表必须具有单个整数不可为 null 的列聚集索引。
  • 在矢量索引创建完成所需的所有时间期间和所有时间,都会在表中获取 SCH-M 锁。 因此,锁会阻止对表或其元数据的任何访问。
  • 在表上创建矢量索引后,该表将变为只读。 当表上存在向量索引时,不允许进行任何数据修改。
  • 矢量索引不会复制到订阅服务器。

权限

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

例子

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

示例假定存在一个表,该表具有wikipedia_articles存储标题的维基百科文章嵌入的类型title_vectorvectortitle_vector 假定是使用嵌入模型(如 text-embedding-ada-002text-embedding-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 = 'cosine', 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
DBCC TRACEON(466, 474, 13981, -1);
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;