Поделиться через


VECTOR_SEARCH (Transact-SQL) (предварительная версия)

Относится к: SQL Server 2025 (17.x) Azure SQL DatabaseSQL Database в Microsoft Fabric

Поиск векторов, аналогичных заданным векторам запроса, с помощью приблизительного алгоритма поиска ближайших соседей. Дополнительные сведения о том, как работает индексирование векторов и поиск векторов, а также различия между точным и приблизительным поиском, см. векторные индексы и векторные индексы в ядре СУБД SQL.

База данных Azure SQL и база данных SQL в платформе Fabric

Эта функция находится в предварительном просмотре. Прежде чем использовать его, обязательно ознакомьтесь с текущими ограничениями .

Замечание

В отношении технологии (как предварительной версии функции), описанной в этой статье, действуют дополнительные условия использования предварительных версий Microsoft Azure.

Это важно

Для оптимальной производительности и доступа к новейшим возможностям поиска векторов используйте векторные индексы, созданные с последней версией. Дополнительные сведения об обновлении существующих индексов и сравнении версий см. в статье CREATE VECTOR INDEX — обновление векторных индексов до последней версии.

Региональная доступность

Эта функция развертывается в базе данных SQL Azure и базе данных SQL в Microsoft Fabric. Во время развертывания доступность и поведение могут отличаться по регионам и по версии индекса. Если функция или синтаксис недоступны, она становится доступной автоматически по мере завершения развертывания. Сведения о текущем состоянии региональной доступности см. в разделе "Доступность компонентов по регионам".

Предупреждение

Уведомление об устаревших версиях: параметр TOP_N не VECTOR_SEARCH рекомендуется и поддерживается только для обратной совместимости с более ранними индексами векторов версий. Вместо этого новые реализации должны использовать SELECT TOP (N) WITH APPROXIMATE синтаксис. Дополнительные сведения см. в разделе "Синтаксис".

Функция предварительного просмотра SQL Server 2025

В SQL Server 2025 эта функция находится в предварительном просмотре и может измениться. Чтобы использовать эту функцию, необходимо включить конфигурацию с областью PREVIEW_FEATURESдействия базы данных.

Прежде чем использовать его, обязательно ознакомьтесь с текущими ограничениями .

Замечание

Последняя версия векторных индексов доступна только в базе данных SQL Azure и базе данных SQL в Microsoft Fabric в настоящее время.

Основные улучшения с последними векторными индексами

Векторные индексы, созданные с помощью последней версии, представляют значительные улучшения:

  • Полная поддержка DML. Удаляет предыдущее ограничение, которое сделало таблицы с индексированием вектора только для чтения после создания индекса. Теперь можно выполнять операции INSERT, UPDATE, DELETE и MERGE, сохраняя функции векторного индекса с автоматическим обслуживанием индекса в реальном времени.
  • Итеративная фильтрация: предикаты в предложении WHERE применяются во время процесса поиска вектора, а не после извлечения
  • Оптимизатор: оптимизатор запросов автоматически определяет, следует ли использовать индекс DiskANN или поиск kNN на основе характеристик запроса.
  • Расширенная квантизация: методы квантизации векторов были интегрированы для повышения эффективности хранения и повышения производительности запросов, при этом эти оптимизации прозрачны для пользователей.

Syntax

Соглашения о синтаксисе Transact-SQL

Последняя версия Vector Indexes:

Это важно

При запросе таблиц, использующих последнюю версию векторного индекса, приблизительный векторный поиск должен использовать синтаксис 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 Indexes:

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 с той же метрикой и на том же столбце. Если нет совместимых индексов 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 поиска. Это требование синтаксиса указывает, что запрос явно запрашивает приблизительные результаты ближайшего соседа.

В следующем примере показано, как найти в таблице 10 наиболее похожих Pink Floyd music stylewikipedia_articles_embeddings статей.

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. Подробные сведения см. в разделе "Ошибка с использованием устаревшего синтаксиса " в разделе "Ожидаемые поведения".

В. Завершение рабочего процесса с созданием индекса

Базовый комплексный пример использования CREATE VECTOR INDEX и связанной VECTOR_SEARCH функции. Внедренные макеты издеваются. В реальном мире внедрение создается с помощью модели внедрения и AI_GENERATE_EMBEDDINGS или внешней библиотеки, например OpenAI SDK.

Замечание

Последняя версия векторных индексов требует не менее 100 строк данных перед созданием индекса. В этом примере вставляется 100 строк в соответствии с этим требованием. Дополнительные сведения см. в разделе "Минимальные требования к данным".

Следующий блок кода демонстрирует функцию VECTOR_SEARCH с макетами внедрения:

  1. Включает функцию предварительной версии (требуется только для SQL Server 2025; не требуется только для базы данных SQL Azure или базы данных SQL в Fabric).
  2. Создайте пример таблицы dbo.Articles со столбцом embedding с вектором типа данных(5).
  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)
DECLARE @i INT = 1;
WHILE @i <= 100
BEGIN
    INSERT INTO Articles (id, title, content, embedding)
    VALUES (
        @i, 
        'Article ' + CAST(@i AS NVARCHAR(10)), 
        'Content for article ' + CAST(@i AS NVARCHAR(10)),
        JSON_ARRAY(
            CAST(@i * 0.01 AS FLOAT),
            CAST(@i * 0.02 AS FLOAT),
            CAST(@i * 0.03 AS FLOAT),
            CAST(@i * 0.04 AS FLOAT),
            CAST(@i * 0.05 AS FLOAT)
        )
    );
    SET @i = @i + 1;
END
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;

С. Поиск вектора с итеративной фильтрацией

В следующем примере демонстрируется итеративная фильтрация с последними индексами векторов версий. Запрос находит аналогичные статьи при применении предикатов во время процесса поиска.

С последними индексами версий предикаты в предложении 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".

Д. Соединения с несколькими таблицами с помощью 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;

Ключевые функции этого примера:

  • Область псевдонима таблицы: псевдоним eTABLE = wikipedia_articles_embeddings AS e доступен в предложении WHERE для итеративной фильтрации с последними индексами версий.

Ожидаемое поведение

Ошибка с использованием устаревшего синтаксиса

При попытке использовать 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: векторный поиск с итеративной фильтрацией.

Требования к предложению ORDER BY

При использовании SELECT TOP (N) WITH APPROXIMATEпредложение ORDER BY имеет определенные требования:

  • ORDER BY должен присутствовать: запросы без предложения ORDER BY завершаются ошибкой.
  • Только допустимый столбец расстояния: предложение ORDER BY должно ссылаться только на столбец расстояния из результирующий набор VECTOR_SEARCH. Включение дополнительных столбцов завершается ошибкой. Для сортировки по нескольким столбцам используйте шаблон вложенных запросов, описанный в нескольких столбцах ORDER BY.
  • Только по возрастанию: столбец расстояния должен быть упорядочен в порядке возрастания (ASC). Порядок убывания (DESC) не поддерживается.

Допустимый ORDER BY:

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 может выполнять запросы, даже если в целевом столбце нет векторного индекса. Без индекса запрос выполняет полную проверку таблицы (поиск ближайшего соседа (kNN) для вычисления расстояний для всех строк.

Поведение запроса без TOP WITH APPROXIMATE

При использовании VECTOR_SEARCH без SELECT TOP (N) WITH APPROXIMATEэтого поведение запроса зависит от наличия TOP и ORDER BY предложений:

  • Нет top, no ORDER BY или ORDER BY non-distance: полная проверка таблицы (поиск подбора), которая вычисляет и возвращает расстояния для всех строк.
  • TOP (no APPROXIMATE) с 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), даже если оптимизатор может в противном случае выбрать другую стратегию выполнения.

Синтаксис

FROM VECTOR_SEARCH(
    TABLE      = table_name,
    COLUMN     = column_name,
    SIMILAR_TO = vector_value,
    METRIC     = 'metric_name'
) AS alias WITH (FORCE_ANN_ONLY)

Example:

В следующем примере используется приблизительный ближайший соседний индекс для запроса векторного поиска:

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 во внешнем запросе.

Распространенные сценарии

В следующей таблице перечислены операции, требующие шаблона вложенных запросов:

Операция Пример варианта использования
ГРУППИРОВКА ПО Вычисление статистики на категорию
Агрегатные функции Общее число, AVG, MIN, MAX в результатах
Функции окна ROW_NUMBER, RANK, DENSE_RANK, NTILE
Установка операций UNION, UNION ALL, ЗА ИСКЛЮЧЕНИЕМ, INTERSECT
Несколько столбцов 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 APPROXIMATECROSS 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';

В этом шаблоне:

  • Каждый векторный поиск ограничен 10 лучшими результатами в вложенных запросах.
  • Внешний запрос не используется WITH APPROXIMATE
  • Результаты должным образом ограничены для каждой строки из внешней таблицы

Операции, которые работают напрямую

Следующие операции можно использовать напрямую без VECTOR_SEARCH запроса вложенного запроса: