VIEW (Векторный индекс)
Для выполнения запроса SELECT с использованием векторного индекса в строчно-ориентированной таблице используйте следующий синтаксис:
PRAGMA ydb.KMeansTreeSearchTopSize = "10";
SELECT ...
FROM TableName VIEW IndexName
WHERE ...
ORDER BY Knn::DistanceFunction(...)
LIMIT ...
PRAGMA ydb.KMeansTreeSearchTopSize = "10";
SELECT ...
FROM TableName VIEW IndexName
WHERE ...
ORDER BY Knn::SimilarityFunction(...) DESC
LIMIT ...
Принципы работы и настройки векторного индекса подробно описаны в отдельной статье Векторные индексы.
Примечание
Векторный индекс поддерживает функцию расстояния или сходства расширения Knn, выбранную при создании индекса.
Векторный индекс не будет автоматически выбран оптимизатором, поэтому его нужно указывать явно с помощью выражения VIEW IndexName.
Если не использовать выражение VIEW, запрос выполнит полное сканирование таблицы с попарным сравнением векторов. Рекомендуется проверять оптимальность написанного запроса, используя анализ плана выполнения запроса. В частности, следует следить за отсутствием полного сканирования (full scan) основной таблицы.
Важно
При накоплении значительного объёма изменений в таблицах с векторным индексом полнота или производительность поиска может ухудшиться. Подробности смотрите в разделе Обновление векторных индексов.
KMeansTreeSearchTopSize
Векторный поиск по индексу основан на приближённом алгоритме (ANN, Approximate Nearest Neighbors). Это значит, что результат поиска по векторному индексу может отличаться от результата поиска при полном сканировании таблицы.
Полнота поиска по индексу может быть отрегулирована параметром: PRAGMA ydb.KMeansTreeSearchTopSize.
Данный параметр задаёт максимальное число сканируемых кластеров, ближайших к запрашиваемому вектору, на каждом уровне дерева поиска.
Необходимо явно задавать значение данного параметра для каждого запроса.
Значение по умолчанию - 1. То есть, по умолчанию сканируется только 1 ближайший кластер на каждом уровне дерева поиска. Такое значение даёт максимальную производительность поиска, но минимальную возможную полноту. Для увеличения полноты поиска (ценой некоторого замедления) следует увеличить значение PRAGMA, например:
PRAGMA ydb.KMeansTreeSearchTopSize="10";
SELECT *
FROM TableName VIEW IndexName
ORDER BY Knn::CosineDistance(embedding, $target)
LIMIT 10
Примеры
-
Выбор всех полей из таблицы
seriesс использованием векторного индексаviews_index, созданного дляembeddingс мерой близости "косинусное расстояние":PRAGMA ydb.KMeansTreeSearchTopSize="10"; SELECT series_id, title, info, release_date, views, uploaded_user_id, Knn::CosineSimilarity(embedding, $target) as similarity FROM series VIEW views_index ORDER BY similarity DESC LIMIT 10 -
Выбор всех полей из таблицы
seriesс использованием векторного индекса с фильтрациейviews_filtered_index, созданного дляembeddingс мерой близости "косинусное расстояние" и с ускорением фильтрации по колонкеrelease_date:PRAGMA ydb.KMeansTreeSearchTopSize="10"; SELECT series_id, title, info, release_date, views, uploaded_user_id, Knn::CosineSimilarity(embedding, $target) as similarity FROM series VIEW views_filtered_index WHERE release_date = "2025-03-31" ORDER BY similarity DESC LIMIT 10