VECTOR_SEARCH (Transact-SQL) (預覽)

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

使用近似最近鄰向量搜尋演算法搜尋類似於指定查詢向量的向量。 若要深入瞭解向量索引和向量搜尋的運作方式,以及精確搜尋和近似搜尋之間的差異,請參閱 SQL 資料庫引擎中的向量搜尋和向量索引。

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

此功能目前仍在預覽階段。 在使用之前,請務必先查看 目前的限制 。

備註

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

這很重要

為了達到最佳效能並使用最新的向量搜尋功能,請使用最新版本建立的向量索引。 欲了解更多關於升級現有索引及比較版本的資訊,請參見 CREATE VECTOR INDEX - 將向量索引升級至最新版本。

區域可用性

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

Syntax

Transact-SQL 語法慣例

使用最新版本的向量索引:

這很重要

查詢使用最新向量索引版本的資料表時,近似向量搜尋必須使用 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;

查詢的語法依向量索引版本而異:

向量索引版本 語法範例
最新版本 無SELECT TOP (N) WITH APPROXIMATE參數的使用TOP_N
早期版本(已棄用) 在函數中使用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 具有模擬內嵌的函式:

  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  -- 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 e 子句中可取得別名TABLE = wikipedia_articles_embeddings AS 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.

為了解決這個錯誤:

  1. 將參數TOP_N從函數中移除VECTOR_SEARCH
  2. 改用 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時,查詢行為取決於 和 TOP 子句的存在ORDER BY:

  • 沒有 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

在查詢中使用 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截斷。 要從向量索引表中移除所有資料:

  1. 移除向量指數
  2. 截斷表格
  3. 重新填充表格,至少有 100 列
  4. 重建向量索引

範例工作流程:

-- 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 與彙總函數

以下範例計算了各類別頂尖匹配條目的平均距離。 在此範例中,表格中新增category了一個wikipedia_articles欄位用於分類條目。

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 無需子查詢: