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


СОЗДАТЬ ВЕКТОРНЫЙ ИНДЕКС (Transact-SQL) (Предварительный просмотр)

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

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

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

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

Замечание

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

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

Уведомление об отмене. Векторные индексы, созданные с помощью более ранней структуры данных, поддерживаются в текущем выпуске, но будут прекращены в будущей версии. Чтобы обеспечить будущую совместимость и доступ к новейшим возможностям поиска векторов, перенос существующих векторных индексов с помощью шагов, описанных в разделе "Миграция из предыдущих версий векторных индексов ".

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

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

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

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

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

Замечание

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

Синтаксис

Соглашения о синтаксисе 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 - Евклидеан расстояние
  • dot - (Отрицательное) Dot product

TYPE

Тип алгоритма ANN , используемого для построения индекса. В настоящее время поддерживается только DiskANN. DiskANN — это значение по умолчанию.

MAXDOP

Переопределяет параметр конфигурации максимальной степени параллелизма для операции индекса. Дополнительные сведения см. в разделе Конфигурация сервера: максимальная степень параллелизма. Используйте MAXDOP, чтобы ограничить степень параллелизма и результирующее потребление ресурсов для операции сборки индекса.

Параметр max_degree_of_parallelism может иметь одно из следующих значений:

  • 1

    Подавляет формирование параллельных планов.

  • >1

    Ограничивает максимальную степень параллелизма, используемой в параллельной операции индекса, до указанного числа или меньше на основе текущей системной рабочей нагрузки.

  • 0 (по умолчанию)

    Использует степень параллелизма, указанного на уровне сервера, базы данных или группы рабочей нагрузки, если не уменьшается на основе текущей системной рабочей нагрузки.

Дополнительные сведения см. в разделе Настройка параллельных операций индексов.

Замечание

Параллельные операции индексов недоступны в каждом выпуске SQL Server. Список функций, поддерживаемых версиями SQL Server, смотрите раздел «Редакции и поддерживаемые функции SQL Server 2022 » или «Редакции и поддерживаемые функции 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, выполнение на основе оптимизатора и улучшенную квантизацию
  • Миграция не требуется

Создание с помощью более ранней версии

  • Использует устаревшее поведение после фильтрации
  • Не поддерживает последние возможности поиска векторов
  • Миграция настоятельно рекомендуется обеспечить будущую совместимость

Шаг 2. Удаление и повторное создание векторного индекса

Векторные индексы, созданные с помощью более раннего формата, не могут быть обновлены. Чтобы включить последние возможности 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, DELETE, MERGE) не допускаются после создания векторного индекса. Используйте конфигурацию базы данных, ALLOW_STALE_VECTOR_INDEX чтобы включить операции DML, если вы можете допускать устаревшие результаты поиска.

  • Настройка вручную TOP_N: необходимо вручную настроить TOP_N параметр VECTOR_SEARCH для компенсации после фильтрации, часто требуя превышения значений для получения требуемого количества результатов.

Текущие ограничения (применяются к последней версии)

Текущая предварительная версия имеет следующие ограничения:

  • Векторные индексы нельзя секционировать. Нет поддержки секций.

  • Таблица должна иметь кластеризованный индекс первичного ключа.

  • Векторные индексы не реплицируются подписчикам.

  • Таблицы с векторными индексами не могут быть усечены с помощью TRUNCATE TABLE. Чтобы удалить все данные, сначала удалите векторный индекс, усечь таблицу, повторно заполните по крайней мере 100 строк, а затем повторно создайте индекс. Дополнительные сведения см. в разделе "Ограничения TRUNCATE TABLE".

Минимальные требования к данным

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

  • Минимальное число строк: в таблице должно существовать не менее 100 строк со значениями векторов, отличных от NULL.
  • Поведение ошибки: попытка создать векторный индекс в таблице с менее чем 100 строк завершается ошибкой Msg 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, которая возвращает векторы с 1536 измерениями.

Дополнительные примеры, включая комплексные решения, см. в репозитории GitHub для векторного поиска базы данных SQL Azure.

Пример 1

В следующем примере создается векторный индекс столбца title_vectorcosine с помощью метрики.

CREATE VECTOR INDEX vec_idx
    ON [dbo].[wikipedia_articles] ([title_vector])
        WITH (METRIC = 'COSINE', TYPE = 'DISKANN');

Пример 2

В следующем примере создается векторный индекс столбца 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; не требуется только для базы данных 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)
INSERT INTO Articles (id, title, content, embedding)
SELECT
    value AS id,
    'Article ' + CAST(value AS NVARCHAR(10)),
    'Content for article ' + CAST(value AS NVARCHAR(10)),
    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 .