適用於: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
在向量欄位建立近似索引,以提升最近鄰搜尋的效能。 欲了解更多向量索引與向量搜尋的運作方式,以及精確搜尋與近似搜尋的差異,請參閱 SQL 資料庫引擎 中的向量搜尋與向量索引。
功能可用性
- 向量索引 和
VECTOR_SEARCH通常可用(GA)於 Azure SQL Database,SQL 資料庫在 Microsoft Fabric,並Azure SQL 受控執行個體 以 Always-up-to-date更新政策。 - 向量索引 和
VECTOR_SEARCH是 SQL Server 2025(17.x)以及 Azure SQL 受控執行個體 中搭配 SQL Server 2025 更新政策的預覽功能。
警告
退役通知:目前版本支援使用早期資料結構建立的向量索引,但未來版本將被淘汰。 為確保未來相容性及使用最新向量搜尋功能,請依照「 從早期向量索引版本遷移 」部分的步驟遷移現有向量索引。
SQL Server 2025 預覽功能
在 SQL Server 2025 和 SQL Server 2025更新政策中的 Azure SQL 受控執行個體 中,向量索引和函VECTOR_SEARCH式仍處於預覽階段,可能會有所變動。 要使用此功能,您必須啟用 PREVIEW_FEATURES資料庫範圍設定。
使用前請檢查 電流限制 。
備註
向量索引的最新版本提供 Azure SQL Database,SQL 資料庫在 Microsoft Fabric,並Azure SQL 受控執行個體 Always-up-to-date 更新政策。
語法
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、DELETE、MERGE及操作。 -
迭代過濾:在向量搜尋過程中套用子句中的謂詞
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 部署。 你可以從 DacFx 170.5.96 版本開始部署包含向量索引的資料庫。 向量索引是在資料載入後建立,且索引資料表必須包含至少 100 列非
NULL向量值。在僅架構的 DACPAC 部署中,若目標資料表中非
NULL向量值的列少於 100 列,部署可成功而無需建立向量索引。 DacFx 不會在後續新增列時自動建立跳過的索引。 載入至少 100 個合格列後,使用部署後腳本建立向量索引,重新發布 DACPAC,或執行CREATE VECTOR INDEX。匯入或部署後,透過查詢
sys.vector_indexes確認向量索引已建立。在 DacFx 版本 170.5.96 之前,作為一個變通方法,匯出資料庫前先刪除向量索引,匯入後再重新建立索引。
最低資料需求
向量索引需要至少有幾列非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_vectorvector儲存維基百科條目的標題嵌入。 它 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
以下範例利用(負)dot乘積度量在欄位title_vector上建立向量索引。 它將平行度限制為 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 模擬嵌入方式示範:
- 啟用預覽功能(僅 SQL Server 2025 需要,Azure SQL Database 或 Fabric 中的 SQL 資料庫則不需要)。
- 使用數據類型
dbo.Articles的數據行embedding建立範例數據表。 - 插入 100 列帶有模擬嵌入資料的樣本資料。
- 在上
dbo.Articles.embedding建立向量索引。 - 使用函式示範向量相似度搜尋
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 所有變更。