適用於: SQL Server 2025 (17.x)
Azure SQL Database
SQL database in Microsoft Fabric
使用近似最近鄰向量搜尋演算法搜尋類似於指定查詢向量的向量。 若要深入瞭解向量索引和向量搜尋的運作方式,以及精確搜尋和近似搜尋之間的差異,請參閱 SQL 資料庫引擎中的向量搜尋和向量索引。
Fabric 中的 Azure SQL 資料庫和 SQL 資料庫
此功能目前仍在預覽階段。 在使用之前,請務必先查看 目前的限制 。
備註
作為預覽功能,本文所述的技術受限於 Microsoft Azure 預覽版增補使用規定。
這很重要
為了達到最佳效能並使用最新的向量搜尋功能,請使用最新版本建立的向量索引。 如需更多關於升級現有索引及比較版本的資訊,請參閱 「建立向量索引 - 將向量索引升級至最新版本」。
區域可用性
此功能已部署於 Azure SQL 資料庫及 Microsoft Fabric 中的 SQL 資料庫。 在推出期間,可用性與行為可能因地區及指數版本而異。 如果某個功能或語法無法使用,部署完成時會自動啟用。 有關目前區域可用性狀況,請參見 「各區域功能可用性」。
警告
棄用通知: TOP_N 該 VECTOR_SEARCH 參數已棄用,僅為了向後相容早期版本的向量索引而維護。 新的實作應該改用 SELECT TOP (N) WITH APPROXIMATE 語法。 欲了解更多資訊,請參閱 語法。
SQL Server 2025 預覽功能
在 SQL Server 2025 中,此函式仍處於預覽階段,可能會有所變動。 若要使用此功能,您必須啟用 PREVIEW_FEATURES資料庫範圍的組態。
在使用之前,請務必先查看 目前的限制 。
備註
目前 Vector Indexes 最新版本僅在 Azure SQL 資料庫及 Microsoft Fabric 的 SQL 資料庫中提供。
最新向量索引的重點增強
以最新版本建立的向量索引帶來了顯著的改進:
- 完整 DML 支援:移除先前限制向量索引資料表在建立索引後為唯讀的限制。 你現在可以在維持向量索引功能的同時,執行插入、更新、刪除和合併操作,並能自動即時維護索引
- 迭代過濾:WHERE 子句中的謂詞是在向量搜尋過程中套用,而非檢索後
- 優化器驅動:查詢優化器會根據查詢特性自動決定是否使用 DiskANN 索引或 kNN 搜尋
- 進階量化:已整合向量量化技術,以提升儲存效率與更快的查詢效能,這些優化對使用者來說是透明的
Syntax
使用最新版本的向量索引:
這很重要
查詢使用最新向量索引版本的資料表時,近似向量搜尋必須使用 TOP(N) APPROXIMATE 語法。 此語法要求表示查詢明確要求近似最近鄰結果。
SELECT TOP (N) WITH APPROXIMATE
column_list
FROM VECTOR_SEARCH(
TABLE = object [ AS source_table_alias ]
, COLUMN = vector_column
, SIMILAR_TO = query_vector
, METRIC = { 'cosine' | 'dot' | 'euclidean' }
) [ AS result_table_alias ]
[ WHERE predicate ]
ORDER BY distance;
早期版本的向量索引:
VECTOR_SEARCH(
TABLE = object [ AS source_table_alias ]
, COLUMN = vector_column
, SIMILAR_TO = query_vector
, METRIC = { 'cosine' | 'dot' | 'euclidean' }
, TOP_N = k
) [ AS result_table_alias ]
這很重要
最新版本的向量索引不支援此 TOP_N 參數。 請使用 SELECT TOP (N) WITH APPROXIMATE 上述語法。 欲了解更多資訊,請參閱 「使用舊有語法的錯誤」。
Arguments
TABLE = 物件 [AS source_table_alias]
執行搜尋的數據表。 它必須是基表。 不支持檢視表、本機和全域數據表。
資料行 = vector_column
執行搜尋的向量數據行。 資料行必須是 向量 資料類型。
SIMILAR_TO = query_vector
用於搜尋的向量。 它必須是 變數或向量 類型的直欄。
METRIC = { 'cosine' |'dot' |'euclidean' }
用來計算查詢向量與指定數據行中向量之間的距離度量。 只有在找到具有相同計量且位於相同數據行的相符 ANN 索引時,才會使用 ANN (近似近鄰)索引。 若無相容的人工神經網路索引,則會發出警告並使用 kNN(k-最近鄰)演算法。
TOP_N = <k>
警告
此參數已被棄用並維護,僅為了與早期版本的向量索引向下相容。 對於最新版本的索引,請改用 SELECT TOP (N) WITH APPROXIMATE 語法。 新的實作應該使用最新的語法。
必須傳回的類似向量數目上限。 它必須是正 整數。 使用此參數不支援使用最新版本建立的向量索引。
result_table_alias
別名是用來參考結果集。
傳回結果集
函數傳回的 VECTOR_SEARCH 結果集包括:
引數中
TABLE指定之表格中的所有資料行。名為
distance的附加直欄,代表引數所COLUMN指定直欄中的向量與引數中SIMILAR_TO提供的向量之間的距離。
距離列是由函數本身產生 VECTOR_SEARCH 的,而所有其他列則來自引數中 TABLE 引用的表。
如果您在引數中使用 TABLE 資料表的別名,則必須使用相同的別名來參照陳述式中的 SELECT 資料行。 您無法使用指派 VECTOR_SEARCH 給的別名來參考 中指定的 TABLE資料表中的資料行。 如果您想到透過取得 的 VECTOR_SEARCH 輸出並將其與資料表資料合併來建置的結果集,則此行為會更容易理解。
如果引數中 TABLE 指定的表格已包含名為 distance的直欄,則行為將類似於共用直欄名稱的兩個表格之間的 SQL 聯結。 在這種情況下,您必須使用表格別名來消除資料行參照的歧義,否則會引發錯誤。
這很重要
欄位 distance 是近似向量搜尋結果唯一有效的排序鍵。
Limitations
-
僅按升序排列:欄位
distance必須依升序排列(ASC)。 不支援遞減順序(DESC)。
版本專屬行為
的 VECTOR_SEARCH 行為會依向量指標版本而異。
早期的向量索引版本
備註
這些限制僅適用於早期版本建立的向量索引。 遷移到最新版本以啟用迭代過濾。 請參見 從早期向量索引版本遷移。
僅在後篩選:向量搜尋在應用任何謂詞之前進行。 只有在傳回最類似的向量之後,才會套用其他述詞。 下列範例會傳回前 10 個數據列,內嵌最類似於查詢向量 @qv,然後套用 子句中指定的 WHERE 述詞。 如果與向量搜尋所傳回的向量相關聯的 10 個數據列中沒有任何數據列等於 accepted 1,則結果會是空的。
SELECT TOP (10) s.id,
s.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.sessions AS s,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10
) AS r
WHERE accepted = 1
ORDER BY r.distance;
一般限制
VECTOR_SEARCH 無法在檢視主體中使用。
Examples
答: 基本向量相似性搜尋
這很重要
查詢使用最新向量索引版本的資料表時,近似向量搜尋必須使用該 TOP (N) WITH APPROXIMATE 語法。 此語法要求表示查詢明確要求近似最近鄰結果。
以下範例列出表中最相似的 Pink Floyd music stylewikipedia_articles_embeddings 10篇文章。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles_embeddings AS t,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance;
查詢的語法依向量索引版本而異:
| 向量索引版本 | 語法範例 |
|---|---|
| 最新版本 | 無TOP_N參數的使用SELECT TOP (N) WITH APPROXIMATE |
| 早期版本(已棄用) | 在函數中使用TOP_N參數VECTOR_SEARCH |
小提示
要確定你的向量索引版本,請參見「從早期向量索引版本遷移」。
對於早期版本的索引(已棄用語法):
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10)
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles_embeddings AS t,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10 -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
) AS r
ORDER BY r.distance;
備註
使用帶有最新版本向量索引的 TOP_N 參數,回傳錯誤訊息 Msg 42274。 詳細資訊請參閱「預期行為」章節 中的「使用舊有語法的錯誤 」。
B. 完整的工作流程與索引建立
使用 CREATE VECTOR INDEX 和相關 VECTOR_SEARCH 函式的基本端對端範例。 內嵌會模擬。 在真實世界的案例中,內嵌是使用內嵌模型和 AI_GENERATE_EMBEDDINGS,或 OpenAI SDK 之類的外部連結庫來產生。
備註
最新版本的向量索引在建立索引前至少需要 100 列資料。 此範例插入 100 列以滿足此需求。 欲了解更多資訊,請參閱 最低數據需求。
下列程式代碼區塊示範 VECTOR_SEARCH 具有模擬內嵌的函式:
- 啟用預覽功能(僅適用於 SQL Server 2025;Azure SQL 資料庫或 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;
查詢的語法依向量索引版本而異:
| 向量索引版本 | 語法範例 |
|---|---|
| 最新版本 | 無TOP_N參數的使用SELECT TOP (N) WITH APPROXIMATE |
| 早期版本(已棄用) | 在函數中使用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 -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
) AS s
ORDER BY s.distance, t.title;
C. 帶有迭代濾波的向量搜尋
以下範例展示了使用最新版本向量索引進行迭代過濾。 查詢在搜尋過程中套用謂詞時會找到類似的文章。
在最新版本索引中,WHERE 子句中的謂詞會在向量搜尋 過程中套用 (而非之後)。 引擎會持續搜尋,直到找到 5 列符合所有條件的合格列:
- 向量與「機器學習演算法」的相似性
- 類別等於「科技」
- 已發表狀態等於1
這樣可以確保你能得到恰好 5 個結果(如果有的話),不用手動調整搜尋參數。 欲詳細比較早期與最新版本,請參閱預期行為章節中的 迭代過濾行為 。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning algorithms' USE MODEL Ada2Embeddings);
SELECT TOP (5) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
WHERE t.category = 'Technology'
AND t.published = 1
ORDER BY r.distance;
備註
某些 SQL 操作如 GROUP BY、聚合函式和視窗函式需要子查詢模式。 詳情請參見 「結合向量搜尋與其他 SQL 操作」。
D. 多表連接與 INNER JOIN 的連結
以下範例展示了多表中INNER JOIN的過濾功能。 當嵌入資料與主實體資料分開存放時,請使用。
-- Assuming a schema with separate tables for articles and embeddings
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence and machine learning' USE MODEL Ada2Embeddings);
SELECT TOP (10) WITH APPROXIMATE
a.id,
a.title,
a.category,
vs.distance
FROM wikipedia_articles a
INNER JOIN VECTOR_SEARCH(
TABLE = wikipedia_articles_embeddings AS e,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS vs ON a.id = e.article_id
WHERE e.approved = 1 -- Iterative filter on embedding table
AND a.category IN ('Technology', 'Science') -- Filter on main table
AND a.views > 50000
ORDER BY vs.distance;
此範例的主要特點:
-
表格別名範圍:WHERE
TABLE = wikipedia_articles_embeddings AS e子句中可取得別名e,用於迭代過濾及最新版本索引
預期行為
使用舊有語法的錯誤
如果你在查詢具有最新版本向量索引的資料表時嘗試使用 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.
為了解決這個錯誤:
- 將參數
VECTOR_SEARCH從函數中移除TOP_N - 改用
SELECT TOP (N) WITH APPROXIMATE語法
錯誤(使用最新版本索引產生錯誤):
SELECT TOP (10)
t.id,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10 -- This parameter causes the error with latest version indexes
) AS r;
正確(可使用最新版本索引):
SELECT TOP (10) WITH APPROXIMATE -- Specify TOP and WITH APPROXIMATE here
t.id,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
-- No TOP_N parameter
) AS r
ORDER BY r.distance;
迭代過濾行為
最新版本相較於早期的向量索引版本引入了顯著改進:
| 層面 | 早期版本 | 最新版本 |
|---|---|---|
| 謂詞應用 | 關聯謂詞是在向量搜尋回傳固定數量最近鄰(僅過濾後)後進行的 | 關聯謂詞是在向量搜尋過程中應用的(迭代過濾) |
| 結果完備性 | 如果初始最近鄰不符合篩選條件,即使有限定列,查詢也可能回傳較少的列數——甚至沒有列 | 當有合格資料存在時,查詢會回傳預期的列數,無需手動調整或重寫查詢 |
| TOP(N)調音 | 使用者常需猜測或過度取樣 TOP(N) 值以補償後過濾 | 不需要猜測 TOP (N) 值。 引擎會持續搜尋,直到找到足夠的合格列或搜尋空間用盡為止 |
| 查詢優化 | 不適用 | SQL Server 會自動選擇最有效率的執行策略,包括在適當時切換向量索引尋道與 kNN 掃描 |
關於迭代過濾的實務範例,請參見 範例 C:帶有迭代過濾的向量搜尋。
依據命令條款的要求
使用 SELECT TOP (N) WITH APPROXIMATE時,ORDER BY 條款有特定要求:
- 必須包含 ORDER BY:沒有 ORDER BY 子句的查詢會因錯誤而失敗。
- 僅允許距離欄:ORDER BY 子句必須只引用VECTOR_SEARCH結果集中的距離欄。 新增欄位會因錯誤而失敗。 若要依多欄排序,請使用「 多重排序 BY」欄位中描述的子查詢模式。
- 僅按升序排列:距離欄必須依升序排列(ASC)。 不支援遞減順序(DESC)。
有效訂單由:
SELECT TOP (10) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance; -- ✓ Valid
無效的 ORDER BY 模式:
-- Missing ORDER BY
SELECT TOP (10) WITH APPROXIMATE
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r;
-- ✗ Error Msg 42248: APPROXIMATE cannot be used in a query without ORDER BY
-- Multiple columns in ORDER BY
SELECT TOP (10) WITH APPROXIMATE
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance, t.title;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY
-- on distance column ascending, and no other columns
-- Descending order
SELECT TOP (10) WITH APPROXIMATE
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r
ORDER BY r.distance DESC;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY
-- on distance column ascending, and no other columns
沒有向量指標的行為
VECTOR_SEARCH 即使目標欄位上沒有向量索引,也能執行查詢。 若無索引,查詢會進行完整資料表掃描(k-最近鄰(kNN)搜尋),以計算所有列的距離。
沒有 TOP WITH APPROXIATE 的查詢行為
當使用VECTOR_SEARCH沒有 SELECT TOP (N) WITH APPROXIMATE時,查詢行為取決於 和 ORDER BY 子句的存在TOP:
- 沒有 TOP、沒有 ORDER BY 或 ORDER BY 非距離:全表掃描(暴力破解搜尋),計算並回傳所有列的距離
- TOP(無近似)以 ORDER BY DISTANCE:以 kNN 搜尋(k-最近鄰)方式執行,這是一種精確最近鄰搜尋
範例 - 全掃描,距離欄:
-- Returns all rows with calculated distances
SELECT
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY t.id; -- Not ordering by distance
範例 - kNN 搜尋(精確最近鄰):
-- Returns exact top 10 nearest neighbors using kNN
SELECT TOP (10)
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance; -- No WITH APPROXIMATE = exact kNN
頂部帶有近似,無VECTOR_SEARCH
在查詢中使用 SELECT TOP (N) WITH APPROXIMATE 「沒有函式」 VECTOR_SEARCH 會產生錯誤。 該 WITH APPROXIMATE 子句要求必須存在一個 VECTOR_SEARCH 函數。
錯誤 - 此查詢失敗:
-- Error: WITH APPROXIMATE requires VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
id,
title,
VECTOR_DISTANCE('cosine', title_vector, @qv) AS distance
FROM dbo.wikipedia_articles
WHERE title_vector IS NOT NULL
ORDER BY VECTOR_DISTANCE('cosine', title_vector, @qv);
正確 - 使用VECTOR_SEARCH:
-- Correct: WITH APPROXIMATE with VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance;
TRUNCATE TABLE 限制
具有向量索引的表格無法用 TRUNCATE TABLE截斷。 要從向量索引表中移除所有資料:
- 移除向量指數
- 截斷表格
- 重新填充表格,至少有 100 列
- 重建向量索引
範例工作流程:
-- Step 1: Drop the vector index
DROP INDEX idx_vector ON wikipedia_articles;
-- Step 2: Truncate the table
TRUNCATE TABLE wikipedia_articles;
-- Step 3: Repopulate with data (at least 100 rows)
-- ... insert operations ...
-- Step 4: Recreate the vector index
CREATE VECTOR INDEX idx_vector
ON wikipedia_articles(title_vector)
WITH (METRIC = 'cosine');
向量搜尋的表格提示
你可以用表格提示來 VECTOR_SEARCH 控制查詢執行行為。
FORCE_ANN_ONLY表格提示會強制查詢優化器只使用近似最近鄰(ANN)索引,即使優化器可能會選擇不同的執行策略。
Syntax:
FROM VECTOR_SEARCH(
TABLE = table_name,
COLUMN = column_name,
SIMILAR_TO = vector_value,
METRIC = 'metric_name'
) AS alias WITH (FORCE_ANN_ONLY)
範例:
以下範例強制使用向量搜尋查詢的近似最近鄰索引:
DECLARE @qembedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);
SELECT TOP 50 WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qembedding,
METRIC = 'cosine'
) AS r WITH (FORCE_ANN_ONLY)
ORDER BY r.distance;
當你想確保查詢使用近似最近鄰索引策略,並覆蓋優化器的自動策略選擇時,請使用 FORCE_ANN_ONLY 。
備註
使用 FORCE_ANN_ONLY 需要以下兩種條件:
- 目標欄位上的向量索引
-
SELECT TOP (N) WITH APPROXIMATE在查詢中
若缺少任一需求,查詢失敗,因為無法使用提示強制的近似最近鄰策略。
結合向量搜尋與其他 SQL 操作
VECTOR_SEARCH該TOP (N) WITH APPROXIMATE函數對其使用有特定要求。 有些 SQL 操作可以直接搭配向量搜尋使用,而有些則需要子查詢模式。
需要子查詢模式的操作
當你需要執行與子查詢不直接相容 TOP (N) WITH APPROXIMATE的操作時,請在子查詢(內查詢)中使用向量搜尋,然後在外部查詢中套用你的操作。 此模式在實現完整 SQL 功能的同時,仍維持近似向量搜尋的效能優勢。
小提示
子查詢模式適用於任何無法直接與 結合的 TOP (N) WITH APPROXIMATE操作。 在內層查詢中套用向量搜尋,然後在外層查詢中使用任何 SQL 操作。
常見場景
下表列出需要子查詢模式的操作:
| 運算 | 使用案例範例 |
|---|---|
| 分組依據 | 計算各類別統計數據 |
| 聚合函數 | 整體計數、平均、最小、最大成績 |
| 視窗函數 | ROW_NUMBER、RANK、DENSE_RANK、NTILE |
| 設定作業 | 聯合、聯合、全部、除、交集 |
| 多重 ORDER BY 欄位 | 先依距離排序,再依日期或標題排序 |
| 獨特的 | 移除重複結果 |
| 交叉申請 | 從外表每列應用向量搜尋 |
GROUP BY 與彙總函數
以下範例計算了各類別頂尖匹配條目的平均距離。 在此範例中,表格中新增wikipedia_articles了一個category欄位用於分類條目。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);
SELECT
category,
COUNT(*) AS article_count,
AVG(distance) AS avg_distance,
MIN(distance) AS closest_match
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
GROUP BY category
ORDER BY avg_distance;
視窗函數
以下範例依相似度排名文章並分配四分位數。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'neural networks' USE MODEL Ada2Embeddings);
SELECT
id,
title,
category,
distance,
ROW_NUMBER() OVER (ORDER BY distance) AS rank,
NTILE(4) OVER (ORDER BY distance) AS quartile
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
WHERE distance < 0.5
ORDER BY rank;
集合運算(UNION、INTERSECT、EXCEPT)
以下範例結合了使用 UNION 兩個不同搜尋查詢的結果。
DECLARE @qv1 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);
DECLARE @qv2 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);
SELECT id, title, 'AI Search' AS source
FROM (
SELECT TOP (50) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv1,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS ai_results
UNION
SELECT id, title, 'ML Search' AS source
FROM (
SELECT TOP (50) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv2,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS ml_results
ORDER BY id;
獨特的
以下範例從頂尖匹配條目中獲得不同類別。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'deep learning' USE MODEL Ada2Embeddings);
SELECT DISTINCT category
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
WHERE distance < 0.7
ORDER BY category;
多重 ORDER BY 欄位
以下範例依距離排序,接著依標題排序平手。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'quantum computing' USE MODEL Ada2Embeddings);
SELECT
id,
title,
category,
distance
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
ORDER BY distance, title;
交叉申請
使用 SELECT TOP (N) WITH APPROXIMATE 時 VECTOR_SEARCH,不能使用 CROSS APPLY 或 OUTER APPLY 在同一句中 FROM 。 即使函數中 VECTOR_SEARCH 沒有外部參考,這也適用。
查詢 邏輯 CROSS APPLY 上會執行多個向量搜尋(從外表每列一次),並將所有結果合併成一個有序的串流。 近似最近鄰演算法無法在維持近似保證與效能特性的同時,有效合併多個獨立向量搜尋的結果。
產生錯誤的模式:
-- This query is NOT supported
SELECT TOP (100) WITH APPROXIMATE
o.id,
vs.title,
vs.distance
FROM Orders AS o
CROSS APPLY VECTOR_SEARCH(
TABLE = Products,
COLUMN = embedding,
SIMILAR_TO = o.customer_preference_vector,
METRIC = 'cosine'
) AS vs
WHERE o.order_date > '2026-01-01'
ORDER BY vs.distance;
此模式嘗試尋找符合每個訂單顧客偏好的相似產品,但無法用近似向量搜尋計畫執行。
推薦的圖案:
要達到類似效果,可以使用一個子查詢,其中 TOP (N) WITH APPROXIMATE 包含 CROSS APPLY :
-- This query IS supported
SELECT
o.id,
vs.title,
vs.distance
FROM Orders AS o
CROSS APPLY (
SELECT TOP (10) WITH APPROXIMATE
p.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = Products AS p,
COLUMN = embedding,
SIMILAR_TO = o.customer_preference_vector,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vs
WHERE o.order_date > '2026-01-01';
在這個模式中:
- 每個向量搜尋僅限於子查詢中排名前十的結果
- 外部查詢不使用
WITH APPROXIMATE - 結果會從外表的每一列正確範圍
直接運作的操作
以下操作可直接使用 , VECTOR_SEARCH 無需子查詢:
- INNER JOIN -參見 範例 D:多表與 INNER JOIN 的連接
- WHERE 謂詞 - 應用迭代或後過濾
- 單次按距離排序