Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: SQL Server 2025 (17.x)
База данных Azure SQL
Управляемый экземпляр Azure SQL
База данных SQL в Microsoft Fabric
Создайте приблизительный индекс на векторном столбце для улучшения эффективности поисков по ближайшим соседям. Чтобы узнать больше о том, как работает векторное индексирование и векторный поиск, а также о различиях между точным и приблизительным поиском, см. раздел векторный поиск и векторные индексы в SQL ядро СУБД.
Доступность функций
- Vector index и
VECTOR_SEARCHare general available (GA) в База данных SQL Azure, SQL база данных в Microsoft Fabric и Управляемый экземпляр SQL Azure с политикой обновленияAlways-up-to-date. - Vector index и
VECTOR_SEARCHявляются предварительные функции в SQL Server 2025 (17.x) и в Azure SQL SQL Managed Instance с политикой обновления SQL Server 2025.
Предупреждение
Уведомление об устарении: векторные индексы, созданные с использованием более ранней структуры данных, поддерживаются в текущем выпуске, но будут выведены из эксплуатации в будущей версии. Чтобы обеспечить будущую совместимость и доступ к последним возможностям векторного поиска, перенесите существующие векторные индексы с помощью шагов в разделе «Миграция с предыдущих версий векторных индексов ».
Функция предварительного просмотра SQL Server 2025
В SQL Server 2025 и Azure SQL SQL Managed Instance в политике обновленияSQL Server 2025 векторные индексы и функция VECTOR_SEARCH находятся в предварительном просмотре и могут измениться. Чтобы воспользоваться этой функцией, необходимо включить PREVIEW_FEATURESконфигурацию базы данных с ограничением данных.
Проверьте текущие ограничения перед использованием.
Замечание
Последняя версия векторных индексов доступна в База данных SQL Azure, в базе данных SQL в Microsoft Fabric и Управляемый экземпляр SQL Azure с политикой обновления всегдаup-toдаты.
Синтаксис
Соглашения о синтаксисе 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 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,MERGEDELETE, ) после создания векторного индекса. Используйте конфигурацию базы данных,ALLOW_STALE_VECTOR_INDEXчтобы включить операции DML, если вы можете допускать устаревшие результаты поиска.Ручная настройка TOP_N: Необходимо вручную настроить
TOP_Nпараметр inVECTOR_SEARCH, чтобы компенсировать постфильтрацию. Часто нужны увеличенные значения, чтобы получить нужное количество результатов.Таблица должна иметь индекс, кластеризованный первичным ключом, в столбце int .
Текущие ограничения (применяются к последней версии)
Текущая предварительная версия имеет следующие ограничения:
Векторные индексы нельзя разбить.
Векторные индексы не реплицируются подписчикам.
Нельзя обрезать таблицы векторными индексами, используя
TRUNCATE TABLE. Чтобы удалить все данные, сначала удалите векторный индекс, усечь таблицу, повторно заполните по крайней мере 100 строк, а затем повторно создайте индекс. Для получения дополнительной информации см. TRUNCATE TABLE раздел «Ограничения».Векторные индексы нельзя развернуть с помощью DacPac. Вы можете развернуть базы данных с векторными индексами с помощью BACPAC, начиная с версии DacFx 170.5.96. Векторные индексы создаются после загрузки данных таблицы, и индексируемая таблица должна содержать не менее 100 строк с невекторными
NULLзначениями.Во время развертывания DACPAC только по схеме развертывание может пройти успешно без создания векторного индекса, если целевой таблица содержит менее 100 строк с невекторными
NULLзначениями. DacFx не создаёт автоматически пропущенный индекс при добавлении строк позже. После загрузки не менее 100 квалифицированных строк создайте векторный индекс с помощью скрипта после развертывания, повторной публикации DACPAC или запускаCREATE VECTOR INDEX.После импорта или развертывания проверьте, что векторный индекс был создан с помощью запроса
sys.vector_indexes.В качестве обходного пути до версии DacFx 170.5.96 нужно убрать векторные индексы перед экспортом базы данных и воссоздать индексы после импорта.
Минимальные требования к данным
Векторные индексы требуют минимального количества строк с невекторнымиNULL значениями, прежде чем вы сможете создать индекс.
-
Минимальное количество строк: В таблице должно быть не менее 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, которая возвращает векторы с размерностью 1 536.
Больше примеров, включая сквозные решения, см. GitHub репозиторий База данных SQL Azure Vector Search Samples.
Пример 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 Database в 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 ' || [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
) 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 .