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
    
Предыдущая
Следующая