共用方式為


CREATE VECTOR INDEX (Transact-SQL)

SQL Server 2025 (17.x) 預覽

在向量數據行上建立近似索引,以改善近鄰搜尋的效能。 若要深入瞭解向量索引編製和向量搜尋的運作方式,以及確切和近似搜尋之間的差異,請參閱 SQL Database Engine 中的向量

預覽功能

備註

這項功能處於預覽狀態,而且可能會變更。 請務必閱讀 在線服務的服務等級協定 (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 Server 2025 Preview 的支援功能

DROP_EXISTING = { ON |OFF }

這是使用修改規格卸除和重建現有向量索引的選項,並保留索引的相同名稱。 預設值為 OFF

  • ON

    指定要卸除並重建現有索引,此索引的名稱必須與 index_name 參數相同。

  • OFF

    指定不要卸除並重建現有索引。 如果指定的索引名稱已存在,SQL Server 就會顯示錯誤。

局限性

目前的預覽有下列限制:

  • 無法分割向量索引。 不支援分割區。
  • 數據表必須具有單一數據行、整數、主鍵叢集索引。
  • 具有向量索引的數據表會變成唯讀。 當數據表上有向量索引時,不允許修改數據。
  • 向量索引不會復寫到訂閱者。

權限

用戶必須具有 ALTER 數據表的許可權。

範例

您可以在這裡找到範例中使用的資料庫詳細數據: 使用向量內嵌下載並匯入維琪百科文章

範例假設有一wikipedia_articles個名為的數據表,其類型title_vector為 數據行vector,其會儲存維琪百科文章的標題內嵌。 title_vector 假設是內嵌模型所產生的內嵌,例如 text-embedding-ada-002text-embedding-3-small,其會傳回具有 1,536 個維度的向量。

如需更多範例,包括端對端解決方案,請移至 Azure SQL Database 向量搜尋範例 GitHub 存放庫

範例 1

下列範例會使用 title_vector 計量,cosine在數據行上建立向量索引。

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

範例 2

下列範例會使用 (negative) 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_EMBEDDINGS,或 OpenAI 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;