Práticas recomendadas para ajustar índices do ScaNN

Selecione uma versão da documentação:

Siga as práticas recomendadas para ajustar os índices do ScaNN e equilibrar o recall de pesquisa e as consultas por segundo (QPS). Dependendo de quantos níveis o índice tem, os parâmetros e valores recomendados mudam.

Para informações sobre como criar índices do ScaNN, consulte Criar um índice do ScaNN.

Limites

Antes de começar a ajustar os índices do ScaNN, reconheça o seguinte limite:

Antes de começar

Se você quiser criar um índice do ScaNN de quatro níveis, primeiro ative o recurso de pré-lançamento para sua instância do AlloyDB. Para ativar o recurso de pré-lançamento, escolha um dos dois métodos a seguir:

Índice de árvore de dois níveis

Para aplicar recomendações que ajudem você a encontrar os valores ideais de num_leaves e num_leaves_to_search para seu conjunto de dados, siga estas etapas recomendadas:

  1. Para criar o índice ScaNN otimizado para os casos a seguir, defina o parâmetro num_leaves como o valor a seguir, em que "rows" é o número de linhas na tabela indexada:
    • Tempo e qualidade de build de índice equilibrados : defina num_leaves como sqrt(rows).
    • Qualidade : defina num_leaves como rows/100.
  2. Execute as consultas de teste, aumentando o valor de scann.num_of_leaves_to_search até atingir o intervalo de recall desejado, por exemplo, 95%. Para mais informações sobre como analisar suas consultas, consulte Analisar suas consultas.
  3. Anote a proporção entre scann.num_leaves_to_search e num_leaves que será usada nas etapas subsequentes. Essa proporção fornece uma aproximação do conjunto de dados que vai ajudar você a alcançar o recall desejado.

    Se você estiver trabalhando com vetores de alta dimensão (500 dimensões ou mais) e quiser melhorar o recall, tente ajustar o valor de scann.pre_reordering_num_neighbors. O valor padrão é definido como 50 * K, em que K é o limite definido na consulta.
  4. Se o QPS estiver muito baixo depois que as consultas atingirem um recall desejado, siga estas etapas:
    1. Recrie o índice, aumentando o valor de num_leaves e scann.num_leaves_to_search de acordo com as orientações a seguir:
      • Defina num_leaves como um fator maior da raiz quadrada da contagem de linhas. Por exemplo, se o índice tiver num_leaves definido como a raiz quadrada da contagem de linhas, tente defini-lo como o dobro da raiz quadrada. Se o valor já for o dobro, tente defini-lo como o triplo da raiz quadrada.
      • Aumente scann.num_leaves_to_search conforme necessário para manter a proporção com num_leaves, que você observou na etapa 3.
      • Defina num_leaves como um valor menor ou igual à contagem de linhas dividida por 100.
    2. Execute as consultas de teste novamente. Enquanto você executa as consultas de teste, experimente reduzir scann.num_leaves_to_search, encontrando um valor que aumente o QPS, mantendo o recall alto. Tente valores diferentes de scann.num_leaves_to_search sem recriar o índice.
  5. Repita a etapa 4 até que o QPS e o intervalo de recall atinjam valores aceitáveis.

Índice de árvore de três níveis

Além das recomendações para o índice de árvore ScaNN de dois níveis, use as orientações a seguir.

Para aplicar recomendações para encontrar o valor ideal dos parâmetros de índice num_leaves e max_num_levels, siga estas etapas:

  1. Crie o índice ScaNN com as seguintes combinações de num_leaves e max_num_levels com base nas suas metas de performance:

    • Equilibrar o tempo de build e a qualidade do índice: defina max_num_levels como 2 e num_leaves como power(rows, ⅔).
    • Otimizar para qualidade: defina max_num_levels como 2 e num_leaves como rows/100.
  2. Execute as consultas de teste. Para mais informações sobre como analisar consultas, consulte Analisar suas consultas.

  3. Anote a proporção entre scann.num_leaves_to_search e num_leaves que será usada nas etapas subsequentes. Essa proporção fornece uma aproximação do conjunto de dados que vai ajudar você a alcançar o recall desejado.

Se você estiver trabalhando com vetores de alta dimensão (500 dimensões ou mais) e quiser melhorar o recall, tente ajustar o valor de scann.pre_reordering_num_neighbors. O valor padrão é definido como 50 * K, em que K é o limite definido na consulta.

  1. Se o QPS estiver muito baixo depois que as consultas atingirem um recall desejado, siga estas etapas:

    • Recrie o índice, aumentando o valor de num_leaves e scann.num_leaves_to_search de acordo com as orientações a seguir:
    • Defina num_leaves como um fator maior de power(rows, ⅔). Por exemplo, se o índice tiver num_leaves definido como power(rows, ⅔), tente defini-lo como o dobro de power(rows, ⅔). Se o valor já for o dobro, tente defini-lo como o triplo de power(rows, ⅔).
    • Aumente scann.num_leaves_to_search conforme necessário para manter a proporção com num_leaves, que você observou na etapa 3.
    • Defina num_leaves como um valor menor ou igual a rows/100.
    • Execute as consultas de teste novamente. Enquanto você executa as consultas de teste, experimente reduzir scann.num_leaves_to_search, encontrando um valor que aumente o QPS, mantendo o recall alto. Tente valores diferentes de scann.num_leaves_to_search sem recriar o índice.
  2. Repita a etapa 4 até que o QPS e o intervalo de recall atinjam valores aceitáveis.

Índice de árvore de quatro níveis

Além das recomendações para índices de árvore de três níveis, use as orientações a seguir para encontrar o valor ideal de num_leaves e max_num_levels:

  1. Crie um índice do ScaNN com as seguintes combinações de num_leaves e max_num_levels com base nas suas metas de performance:

    • Equilibrar o tempo de build e a qualidade do índice: defina max_num_levels como 3 e num_leaves como power(ROWS, 3/4).

    • Otimizar para qualidade: defina max_num_levels como 3 e num_leaves como ROWS/100.

  2. Execute as consultas de teste. Para mais informações sobre como analisar consultas, consulte Analisar suas consultas.

  3. Anote a proporção entre scann.num_leaves_to_search e num_leaves. Use essa proporção para alcançar o recall desejado nas etapas subsequentes.

    Se você estiver trabalhando com vetores de alta dimensão (500 dimensões ou mais) e quiser melhorar o recall, tente ajustar o valor de scann.pre_reordering_num_neighbors.

  4. Se o QPS estiver muito baixo depois que as consultas atingirem um recall desejado, então recrie o índice, aumentando o valor de num_leaves e scann.num_leaves_to_search de acordo com as orientações a seguir:

    1. Defina num_leaves como um fator maior de power(ROWS, 3/4). Por exemplo, se o índice tiver num_leaves definido como o power(ROWS, 3/4), tente defini-lo como o dobro. Se o valor já for o dobro, tente defini-lo como o triplo.

    2. Aumente scann.num_leaves_to_search conforme necessário para manter a proporção com num_leaves, que você observou na etapa três.

    3. Defina num_leaves como um valor menor ou igual a ROWS/100.

    4. Execute as consultas de teste novamente. Enquanto você executa as consultas de teste, experimente reduzir scann.num_leaves_to_search. Encontre um valor que aumente o QPS, mantendo o recall alto. Tente valores diferentes de scann.num_leaves_to_search sem recriar o índice.

  5. Repita a etapa quatro até que o intervalo de recall e o QPS atinjam valores aceitáveis.

Melhorar o recall para pesquisas filtradas

Ao realizar uma pesquisa de vetor de vizinho mais próximo (KNN, na sigla em inglês) que inclui um filtro, você pode encontrar situações em que a consulta retorna menos resultados do que o solicitado na cláusula LIMIT. Isso pode levar ao que é conhecido como recall insuficiente e é mais provável de ocorrer ao usar filtros altamente seletivos. Isso acontece porque as partições iniciais, ou folhas, que o ScaNN pesquisa não contêm vetores suficientes que atendam às condições do filtro.

Para resolver isso, o AlloyDB Omni oferece um recurso que permite que a pesquisa se expanda dinamicamente além do conjunto inicial de folhas para encontrar resultados correspondentes suficientes.

Como o streaming funciona

É possível ativar a funcionalidade de streaming definindo o parâmetro scann.satisfy_limit como relaxed_order. Quando ativada, a verificação de vetor continua pesquisando outras partições de folhas até encontrar resultados suficientes para atender ao LIMIT da consulta, melhorando o recall.

Para evitar que uma pesquisa continue por muito tempo e controlar o impacto na performance, use o parâmetro scann.max_pct_leaves_to_search. Essa configuração atua como uma proteção, definindo um limite superior na porcentagem do total de folhas que uma consulta pode visitar. O valor padrão é 15%.

Quando usar o streaming

Considere usar o recurso de streaming quando:

  • Você usa filtros com suas pesquisas de vetor.
  • Você observa que suas consultas retornam menos resultados do que o esperado com base na cláusula LIMIT.

Ao ativar scann.satisfy_limit, você pode melhorar o recall das pesquisas filtradas. Também é recomendável configurar scann.max_pct_leaves_to_search para alcançar o equilíbrio entre recall e performance de consulta.

Otimizar a performance de consultas filtradas

Para uma performance ideal em consultas filtradas, recomendamos criar um índice B-tree nas colunas filtradas. Isso permite que o planejador de consultas selecione a estratégia de filtragem mais eficiente e reduza significativamente o tempo de execução da consulta.

Manutenção de índice

Se a sua tabela está sujeita a atualizações ou inserções frequentes, recomendamos reindexar periodicamente o índice ScaNN atual para melhorar a acurácia de recall. Você pode monitorar as métricas de índice para visualizar alterações nas distribuições de vetores ou mutações de vetores desde que o índice foi criado e, em seguida, reindexá-lo corretamente. Para mais informações sobre métricas, consulte Visualizar métricas de índice vetorial.

A seguir