Práticas recomendadas para ajustar índices ScaNN no AlloyDB para PostgreSQL

Os parâmetros recomendados para o índice ScaNN variam dependendo se você escolhe criar um índice de árvore de dois ou três níveis. Esta página fornece recomendações sobre como ajustar os parâmetros de índice do AlloyDB para PostgreSQL para um equilíbrio ideal entre recall e QPS.

Criação de índice do ScaNN

Para mais informações, consulte a referência do índice ScaNN.

Índice de árvore de dois níveis

Para aplicar recomendações que ajudam 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 com o valor abaixo, em que "rows" é o número de linhas na tabela indexada:
    • tempo e qualidade de build de índice equilibrados definem num_leaves como sqrt(rows).
    • quality define num_leaves como linhas/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 próximas etapas. Essa proporção fornece uma aproximação do conjunto de dados que vai ajudar você a alcançar a meta de recall.

    Se você estiver trabalhando com vetores de alta dimensão (500 dimensões ou mais) e quiser melhorar o recall, ajuste o valor de scann.pre_reordering_num_neighbors. O valor padrão é definido como 500 * K, em que K é o limite definido na consulta.
  4. Se o QPS estiver muito baixo depois que as consultas atingirem uma taxa de recall desejada, siga estas etapas:
    1. Recrie o índice, aumentando o valor de num_leaves e scann.num_leaves_to_search de acordo com as seguintes orientações:
      • 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 definir como o dobro da raiz quadrada. Se o valor já for duplo, tente definir 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ê anotou 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 executa as consultas de teste, tente reduzir scann.num_leaves_to_search e encontre um valor que aumente as QPS e mantenha o recall alto. Teste 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 de dois níveis ScaNN, use as orientações a seguir.

Para aplicar recomendações e 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 tempo de build e 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 suas 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 próximas etapas. 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, ajuste o valor de scann.pre_reordering_num_neighbors. O valor padrão é definido como 500 * K, em que K é o limite definido na consulta.

  1. Se a QPS estiver muito baixa depois que as consultas atingirem uma meta de recall, siga estas etapas:

    • Recrie o índice, aumentando o valor de num_leaves e scann.num_leaves_to_search de acordo com as seguintes orientações:
    • Defina num_leaves como um fator maior de power(rows, ⅔). Por exemplo, se o índice tiver num_leaves definido como power(rows, ⅔), tente definir como o dobro de power(rows, ⅔). Se o valor já for o dobro, tente definir 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ê anotou na etapa 3.
    • Defina num_leaves com um valor menor ou igual a rows/100.
    • Execute as consultas de teste novamente. Enquanto executa as consultas de teste, tente reduzir scann.num_leaves_to_search e encontre um valor que aumente as QPS e mantenha o recall alto. Teste 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.

Manutenção de índice

Se a tabela estiver sujeita a atualizações ou inserções frequentes, recomendamos reindexar periodicamente o índice ScaNN para melhorar a acurácia de recall. É possível monitorar as métricas de índice para ver mudanças nas distribuições ou mutações de vetores desde que o índice foi criado e, em seguida, reindexar de acordo com isso. Para mais informações sobre métricas, consulte Conferir métricas de índice vetorial.

A seguir