Esta página descreve as práticas recomendadas de indexação de vetores que otimizam os índices vetoriais e melhoram os resultados de consultas de vizinhos mais próximos aproximados (ANN, na sigla em inglês).
Ajustar as opções de pesquisa de vetor
Se você não especificar nenhuma opção de índice vetorial, o Spanner tentará escolher opções otimizadas automaticamente. Para usuários avançados que querem ajustar as
opções de índice vetorial para a carga de trabalho específica, é possível definir e ajustar esses
valores criando um novo índice vetorial e definindo as
index_option_list
na instrução CREATE VECTOR INDEX. Os valores mais ideais para as opções de índice vetorial dependem do caso de uso, do conjunto de dados vetoriais e dos vetores de consulta. Talvez seja necessário realizar ajustes iterativos para encontrar os melhores valores para sua carga de trabalho específica.
Confira algumas diretrizes úteis a serem seguidas ao escolher valores adequados:
tree_depth(nível da árvore): se a tabela que você está indexando tiver menos de 10 milhões de linhas, use umtree_depthde2. Caso contrário, umtree_depthde3oferece suporte a tabelas de até cerca de 10 bilhões de linhas. Se não for especificado, o Spanner vai determinar automaticamente o valor detree_depth.num_leaves: recomendamos segmentar de 200 a 1.000 linhas por folha. Um valor maior denum_leavesaumenta o tempo de build do índice vetorial, mas pode reduzir o custo da consulta para um recall de destino específico. No entanto, valores muito grandes denum_leavespodem fazer com que o custo da consulta aumente novamente devido às sobrecargas associadas à pesquisa de muitos clusters de folhas muito pequenos. Se não for especificado, o Spanner vai determinar automaticamente o valor denum_leaves.num_branches: essa opção só é aplicável quandotree_depthé 3. Recomendamos segmentar de 50 a 500 folhas por ramificação, enum_branchesprecisa ser menor quenum_leaves. Um valor maior denum_branchesaumenta o tempo de build do índice vetorial, mas pode reduzir o custo da consulta para um recall de destino específico. No entanto, valores muito grandes denum_branchespodem fazer com que o custo da consulta aumente novamente devido às sobrecargas associadas à pesquisa de muitos clusters de folhas muito pequenos. Se não for especificado, o Spanner vai determinar automaticamente o valor denum_branches.num_leaves_to_search: essa opção especifica quantos nós de folha do índice são pesquisados. Aumentarnum_leaves_to_searchmelhora o recall, mas também aumenta a latência e o custo. Recomendamos usar um número que seja 1% do número total de folhas definidas na instruçãoCREATE VECTOR INDEXcomo o valor denum_leaves_to_search. Se você estiver usando uma cláusula de filtro, aumente esse valor para ampliar a pesquisa.
Se o recall aceitável for alcançado, mas o custo da consulta for muito alto, resultando em um QPS máximo baixo, tente aumentar num_leaves seguindo estas etapas:
- Defina
num_leavescomo algum múltiplokdo valor original (por exemplo,2 * (table_row_count / 1000)). - Defina
num_leaves_to_searchcomo o mesmo múltiplo k do valor original. - Faça testes reduzindo
num_leaves_to_searchpara melhorar o custo e o QPS, mantendo o recall.
Determinar valores de opção de pesquisa de vetor
Para determinar os parâmetros tree_depth, num_leaves e num_branches que o Spanner está usando para o índice vetorial, consulte a visualização INFORMATION_SCHEMA.INDEX_OPTIONS. Os valores dos parâmetros podem ser ligeiramente diferentes dos valores especificados explicitamente durante a criação do índice, porque o Spanner às vezes os ajusta para melhor atender aos seus dados.
Se você não especificou esses parâmetros, a visualização INFORMATION_SCHEMA.INDEX_OPTIONS mostra os valores escolhidos pelo Spanner.
Execute esta consulta para mostrar os valores dos parâmetros:
SELECT
opt.option_name,
opt.option_type,
opt.option_value
FROM
INFORMATION_SCHEMA.INDEX_OPTIONS AS opt
WHERE
opt.index_name = @vector_index_name;
A consulta retorna linhas, incluindo option_name: system_optimized_tree_depth, system_optimized_num_leaves e system_optimized_num_branches, que refletem os parâmetros usados pelo índice.
Melhorar o recall
Para melhorar o recall, considere ajustar o valor num_leaves_to_search ou recriar o índice vetorial.
Aumentar o valor num_leaves_to_search
Se o valor num_leaves_to_search for muito pequeno, talvez seja mais difícil encontrar os vizinhos mais próximos de alguns vetores de consulta. A criação de um novo índice vetorial com um valor num_leaves_to_search aumentado pode ajudar a melhorar o recall pesquisando mais folhas. As consultas recentes podem conter mais desses vetores desafiadores.
Recriar o índice vetorial
A estrutura de árvore do índice vetorial é otimizada para o conjunto de dados no momento da criação e é estática depois disso. Portanto, se vetores significativamente diferentes forem adicionados após a criação do índice vetorial inicial, a estrutura de árvore poderá ser abaixo do ideal, levando a um recall pior.
Para recriar o índice vetorial sem inatividade:
- Crie um novo índice vetorial na mesma coluna de incorporação que o índice vetorial atual, atualizando os parâmetros (por exemplo,
OPTIONS) conforme apropriado. Depois que a criação do índice for concluída, avalie qual dos dois índices tem melhor desempenho. Se for o caso, siga para a próxima etapa. Caso contrário, descarte o índice vetorial desatualizado. O Spanner decide automaticamente qual índice usar na execução da consulta. O Spanner oferece duas maneiras de especificar o índice a ser usado. Escolha um dos métodos a seguir para avaliar e comparar seus índices:
a. Mude seu aplicativo: é possível atualizar um subconjunto das consultas para que elas usem a dica
FORCE_INDEXpara apontar para o novo índice e atualizar a consulta de pesquisa de vetor. Isso garante que a consulta use o novo índice vetorial. Ao usar esse método, talvez seja necessário reajustarnum_leaves_to_searchna nova consulta.b. Mude seu esquema: é possível definir a opção
disable_searchem um dos seus índices vetoriais. Quando definido comotrue, o Spanner desativa o índice vetorial. Para fazer isso, execute a instrução de mudança de esquemaALTER VECTOR INDEX:ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);Esse método impede que o Spanner use esse índice vetorial no seu banco de dados. Se você tiver dois índices e definir essa opção no índice mais antigo, todas as consultas vão usar o novo índice após a aplicação da mudança de esquema. Se você usar a dica
FORCE_INDEXpara especificar um índice vetorial que tenha a opçãodisable_searchdefinida comotrue, a consulta vai falhar.Descarte o índice vetorial desatualizado.
A seguir
Saiba mais sobre os vizinhos mais próximos aproximados do Spanner .
Saiba mais sobre as funções GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE(),APPROXIMATE_DOT_PRODUCT().Saiba mais sobre as instruções GoogleSQL
VECTOR INDEX.