CREATE VECTOR INDEX (Transact-SQL)(預告)

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

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

Fabric 中的 Azure SQL 資料庫和 SQL 資料庫

此功能目前仍在預覽階段。 在繼續之前,請先確認 限制與注意事項 。

備註

作為預覽功能,本文所述的技術受限於 Microsoft Azure 預覽版增補使用規定。

警告

棄用通知:使用早期資料結構建立的向量索引在目前版本中仍支援,但未來版本將逐步淘汰。 為確保未來相容性及使用最新向量搜尋功能,請依照「 從早期向量索引版本遷移 」部分的步驟遷移現有向量索引。

區域可用性

此功能已部署於 Azure SQL 資料庫及 Microsoft Fabric 中的 SQL 資料庫。 在推出期間,可用性與行為可能因地區及指數版本而異。 如果某個功能或語法無法使用,部署完成時會自動啟用。 有關目前區域可用性狀況,請參見 「各區域功能可用性」。

SQL Server 2025 預覽功能

在 SQL Server 2025 中,此函式仍處於預覽階段,可能會有所變動。 若要使用此功能,您必須啟用 PREVIEW_FEATURES資料庫範圍的組態。

在使用之前,請務必先查看 目前的限制 。

備註

目前 Vector Indexes 最新版本僅在 Azure SQL 資料庫及 Microsoft Fabric 的 SQL 資料庫中提供。

語法

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 各版本所支援的功能清單,請參見 SQL Server 2025 的版本與支援功能。

將向量索引升級至最新版本

這很重要

棄用通知:使用早期資料結構建立的向量索引在目前版本中仍支援,但未來版本將逐步淘汰。 為確保未來相容性及使用最新向量搜尋功能,請依以下步驟遷移現有向量索引。

新建立的向量索引會自動使用最新的資料結構,該結構提供:

  • 完整 DML 支援:移除先前限制向量索引資料表在建立索引後為唯讀的限制。 你現在可以在維持向量索引功能的同時,透過INSERT自動即時索引維護執行 、 UPDATE、 DELETEMERGE 和 操作
  • 迭代過濾:WHERE 子句中的謂詞是在向量搜尋過程中套用,而非檢索後
  • 優化器驅動:查詢優化器會根據查詢特性自動決定是否使用 DiskANN 索引或 kNN 搜尋
  • 進階量化:已整合向量量化技術,以提升儲存效率與更快的查詢效能,這些優化對使用者來說是透明的

關於 早期向量索引版本限制的詳細資訊,請參閱「限制與考量」章節。

從早期向量指標版本遷移

使用舊版本建立的向量索引必須捨棄並重新建立,以啟用最新功能。 本節說明如何識別、遷移及驗證向量索引版本。

步驟 1:識別現有的向量索引

請使用以下查詢來識別需要遷移的向量索引:

SELECT
    i.name AS index_name,
    t.name AS table_name,
    JSON_VALUE(v.build_parameters, '$.Version') AS index_version,
    CASE
        WHEN JSON_VALUE(v.build_parameters, '$.Version') >= '3'
            THEN 'Uses latest version (no migration required)'
        WHEN JSON_VALUE(v.build_parameters, '$.Version') < '3'
            THEN 'Created using an earlier version (migration recommended)'
        ELSE 'Unknown format'
    END AS migration_status
FROM sys.vector_indexes AS v
    INNER JOIN sys.indexes AS i
        ON v.object_id = i.object_id
        AND v.index_id = i.index_id
    INNER JOIN sys.tables AS t
        ON v.object_id = t.object_id
ORDER BY t.name, i.name;
如何解譯結果

使用最新版本

  • 已支援迭代過濾、完整 DML 支援、優化器驅動執行及改良量化
  • 不需要遷移

使用早期版本製作

  • 使用舊有的後濾波行為
  • 不支援最新的向量搜尋功能
  • 強烈建議遷移以確保未來相容性

步驟二:丟棄並重新建立向量索引

使用早期格式建立的向量索引無法原地升級。 要啟用最新的 DiskANN 功能,請刪除並重新建立索引。

警告

服務影響:移除向量索引會立即停用受影響資料表的近似向量搜尋,直到索引重新建立。 規劃在生產系統維護期間的遷移。

刪除現有的指數
DROP INDEX vec_idx ON dbo.wikipedia_articles;
重新建立索引
CREATE VECTOR INDEX vec_idx
    ON dbo.wikipedia_articles (title_vector)
    WITH (
        TYPE = 'DISKANN',
        METRIC = 'COSINE'
    );

備註

使用目前 CREATE VECTOR INDEX 語句建立的向量索引會自動使用最新的 DiskANN 格式。 不需要額外的選項或旗幟。

步驟 3:驗證索引版本

建立之後,請確認索引是否使用最新版本:

SELECT
    i.name AS index_name,
    t.name AS table_name,
    JSON_VALUE(v.build_parameters, '$.Version') AS index_version
FROM sys.vector_indexes AS v
    INNER JOIN sys.indexes AS i
        ON v.object_id = i.object_id
        AND v.index_id = i.index_id
    INNER JOIN sys.tables AS t
        ON v.object_id = t.object_id
WHERE i.name = 'vec_idx';

該 index_version 欄位應該會顯示 3 最新版本。

版本不相容的錯誤行為

如果你嘗試使用 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.

要解決這個錯誤,請移除TOP_N參數,VECTOR_SEARCH改用語法。SELECT TOP (N) WITH APPROXIMATE 詳細資訊請參見 「使用舊有語法的錯誤」。

限制與考量

早期向量指標版本的限制

早期的向量索引版本還有以下額外限制。 要查詢你的索引版本,請參見 「驗證索引版本」。

  • 僅後過濾:謂詞僅在向量檢索後套用,搜尋過程中不適用。 這可能導致在應用過濾器時回傳的資料列數比預期少。

  • 唯讀資料表:具有向量索引的資料表為唯讀。 建立向量索引後,不允許使用 DML 操作INSERT(, UPDATE, DELETEMERGE, ) 如果你能忍受過時的搜尋結果,可以使用 ALLOW_STALE_VECTOR_INDEX 資料庫範圍設定來啟用 DML 操作。

  • 手動TOP_N調整:你必須手動調整 TOP_N 參數 VECTOR_SEARCH 以補償後濾波,通常需要超大數值才能獲得理想的結果數量。

目前的限制(最新版本也適用)

目前的預覽有下列限制:

  • 向量索引無法分割。 不支援分割區。

  • 表格必須在 整數 欄位上有一個主鍵叢集索引。

  • 向量索引不會復寫到訂閱者。

  • 帶有向量索引的表格無法用 TRUNCATE TABLE截斷。 要移除所有資料,先刪除向量索引,截斷表格,重新填充至少 100 列,然後重新建立索引。 欲了解更多資訊,請參閱 TRUNCATE TABLE 限制。

  • 向量索引無法用 DacPac 或 BACPAC 部署。 向量索引在建立時至少需要 100 列且向量非 NULL。 當你使用 DacPac、BACPAC 或匯入/匯出服務匯入資料庫時,匯入過程會在載入資料前建立結構物件(包括向量索引),導致匯入失敗。

    變通方法:匯出資料庫前先移除向量索引,匯入後重新建立索引。

最低資料需求

向量索引需要至少數量的非 NULL 向量值列,才能建立索引。

  • 最小列數:表格中必須至少有 100 列非 NULL 向量值。
  • 錯誤行為:嘗試在資料表中建立向量索引,資料列少於 100 列時會因錯誤訊息 42266 失敗。

範例錯誤:

Msg 42266, Level 16, State 1
Cannot create a vector index. The table contains only 8 rows with non-null vectors, 
but at least 100 are required for vector index creation.

最佳實務:在建立向量索引前,至少在表格中填滿 100 列。 對於需要較少資料列的開發與測試情境, VECTOR_SEARCH 採用暴力破解掃描方法,無需索引即可運作,但隨著資料集擴大,效能會下降。

DML 支援

一旦使用最新版本建立 DiskANN 向量索引,該表格就不再是唯讀。 你可以自由使用標準資料操作語言(DML)修改資料,變更會自動反映在向量搜尋結果中。

此功能使向量搜尋適合資料隨時間變化的即時交易工作負載。

行為筆記

  • DML 操作不需要丟棄或重建向量索引。
  • 交易提交後,向量搜尋查詢會看到變更。
  • 對於大規模資料替換(例如刪除大部分資料列並插入全新嵌入集合),建議在資料載入後刪除並重新建立向量索引,以確保搜尋品質最佳。

備註

DML 支援僅適用於使用最新版本建立的向量索引。 早期版本要求資料表為唯讀或使用 ALLOW_STALE_VECTOR_INDEX 資料庫範圍的設定。

監控向量指數維護

向量索引執行背景維護以納入 DML 變更。 使用 sys.dm_db_vector_indexes 動態管理檢視來監控索引健康狀況與維護任務狀態。

結合向量索引與傳統指標

向量索引與傳統 B 樹索引並行運作,以提供最佳查詢效能。 在使用 VECTOR_SEARCH與 進行迭代過濾時,考慮在用於濾波條件的欄位上建立傳統索引。

關於迭代過濾行為及其與早期版本的差異,請參見 迭代過濾行為。

小提示

查詢優化器會自動選擇最佳執行策略(近似最近鄰索引與 kNN 搜尋)。 若要強制使用近似最近鄰索引,請使用 FORCE_ANN_ONLY 表格提示。 欲了解更多資訊,請參閱 向量搜尋的表格提示。

範例案例:

-- Create vector index for similarity search
CREATE VECTOR INDEX idx_embeddings_vector
ON product_embeddings(embedding)
WITH (METRIC = 'cosine');

-- Create traditional index for filter columns
CREATE NONCLUSTERED INDEX idx_embeddings_filters
ON product_embeddings(category);

績效效益:

在執行帶有迭代篩選的查詢時,SQL Server 查詢優化器會同時使用兩種索引類型:

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'wireless headphones' USE MODEL EmbeddingModel);

SELECT TOP (10) WITH APPROXIMATE
    p.name,
    p.price,
    vs.distance
FROM products p
INNER JOIN VECTOR_SEARCH(
    TABLE = product_embeddings AS e,
    COLUMN = embedding,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS vs ON p.id = e.product_id
WHERE e.approved = 1             
  AND e.category = 'Electronics'  -- Can use traditional index
ORDER BY vs.distance;

在此查詢中:

  • 向量索引可根據查詢向量識別相似的嵌入
  • 傳統的篩選索引(category)在迭代搜尋過程中有效篩選候選人

這種複合策略相較於僅使用向量索引,能顯著提升查詢效能,尤其當過濾謂詞具有高選擇性時。

向量索引的資料品質與維護指引

避免使用重複嵌入量高的資料集

向量索引在嵌入代表多元語意內容時效果最佳。 重複向量比例高的資料集不建議用於向量索引。

高度重複可能導致:

  • 結果品質不佳:重複向量反覆出現,擠壓了更相關的語意匹配。
  • 效率降低:重複嵌入會取代較好的鄰居,降低相似性搜尋的效用。
  • 不必要的資源使用:向量索引建立與維護成本高昂,重複目錄只會增加成本卻不增加價值。

最佳實務:在建立向量索引前先取消重複嵌入,以提升效能與結果品質。

大規模資料替換情境

向量索引支援插入、更新與刪除。 然而,當大部分或全部嵌入被替換——例如以新模型重新嵌入資料集時——現有索引可能不再反映新的資料分布。

在大規模替換情境下:

  • 向量搜尋查詢持續回傳有效結果
  • 但回憶與排名品質可能會下降,因為指數結構是為不同的嵌入分布設計的。

最佳實務:在執行幾乎完整的資料替換(刪除並插入新嵌入)時,載入新資料後刪除並重新建立向量索引。 重新建立索引可確保其對新嵌入分布進行最佳化,並恢復可預測的查詢行為。

已知問題

如需詳細資訊,請檢閱已知問題。

權限

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

範例

下載並匯入 帶有向量嵌入範例的維基百科條目 。

範例假設有一wikipedia_articles個名為的數據表,其類型title_vector為 數據行vector,其會儲存維琪百科文章的標題內嵌。 title_vector 假設是內嵌模型所產生的內嵌,例如 text-embedding-ada-002 或 text-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 = 'DOT', TYPE = 'DISKANN', MAXDOP = 8)
    ON [SECONDARY];

範例 3

使用 CREATE VECTOR INDEX 和相關 VECTOR_SEARCH 函式的基本端對端範例。 內嵌會模擬。 在真實世界的案例中,內嵌是使用內嵌模型和 AI_GENERATE_EMBEDDINGS,或 OpenAI SDK 之類的外部連結庫來產生。

備註

最新版本的向量索引在建立索引前至少需要 100 列資料。 此範例插入 100 列以滿足此需求。 欲了解更多資訊,請參閱 最低數據需求。

以下程式碼區塊以 CREATE VECTOR INDEX 模擬嵌入方式示範:

  1. 啟用預覽功能(僅適用於 SQL Server 2025;Azure SQL 資料庫或 Fabric 中的 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 APPROXIMATE參數的使用TOP_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
    ) AS s
ORDER BY s.distance, t.title;

範例 4:與 DML 作業合作

以下範例展示了使用最新版本建立向量索引的資料表上的 DML 操作。

刪除列

刪除列會從表格和向量搜尋結果中移除它們。

DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;

刪除完成後,移除的列將不再出現在向量搜尋查詢中。

插入新列

你可以插入帶有嵌入的新列,這些列會立即變得可搜尋,而不必重新建立索引。

INSERT INTO dbo.wikipedia_articles (id, title, title_vector)
VALUES (
    99999,
    N'Quantum Computing Basics',
    AI_GENERATE_EMBEDDINGS(N'Quantum Computing Basics' USE MODEL Ada2Embeddings)
);

新插入的嵌入會自動整合到向量索引中,並可由後續的向量搜尋查詢回傳。

更新現有資料列

更新向量欄位或非向量欄位均支援。

DECLARE @new_embedding VECTOR(1536);
SET @new_embedding = AI_GENERATE_EMBEDDINGS(N'Updated article title' USE MODEL Ada2Embeddings);

UPDATE dbo.wikipedia_articles
SET title_vector = @new_embedding,
    title = N'Updated article title'
WHERE id = 50000;

若向量欄位更新,索引也會相應更新,未來的向量搜尋會使用新的嵌入。

複雜運算的應用MERGE

這個 MERGE 語句允許你在單一語句中執行插入、更新和刪除操作。

MERGE INTO dbo.wikipedia_articles AS target
USING (
    SELECT 
        id,
        title,
        AI_GENERATE_EMBEDDINGS(title USE MODEL Ada2Embeddings) AS title_vector
    FROM dbo.staging_articles
) AS source
ON target.id = source.id
WHEN MATCHED THEN
    UPDATE SET 
        title = source.title,
        title_vector = source.title_vector
WHEN NOT MATCHED BY TARGET THEN
    INSERT (id, title, title_vector)
    VALUES (source.id, source.title, source.title_vector)
WHEN NOT MATCHED BY SOURCE AND target.id > 100000 THEN
    DELETE;

向量索引會自動更新,以反映該語句所做的 MERGE 所有變更。