Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Относится к: SQL Server 2025 (17.x)
Azure SQL Database
SQL 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 с макетами внедрения:
- Включает функцию предварительной версии (требуется только для SQL Server 2025; не требуется только для базы данных SQL Azure или базы данных SQL в Fabric).
- Создайте пример таблицы
dbo.Articlesсо столбцомembeddingс вектором типа данных(5). - Вставьте 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 ' + 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 .