Otimize o desempenho das consultas vetoriais no AlloyDB para PostgreSQL

Saiba como otimizar os seguintes índices vetoriais para alcançar um desempenho de consulta mais rápido e uma melhor capacidade de memorização no AlloyDB for PostgreSQL:

Também pode analisar as suas consultas e ver as métricas do índice vetorial para monitorizar e melhorar o desempenho das consultas.

Ajuste um índice HNSW

Ajustar os valores que define para os parâmetros m, ef_construction e hnsw.ef_search pode ajudar a otimizar o desempenho da aplicação.

Parâmetro de aperfeiçoamento Descrição Tipo de parâmetro
m O número máximo de associações por nó no gráfico. Pode começar com o valor predefinido 16(predefinição) e experimentar valores mais elevados com base no tamanho do seu conjunto de dados. Criação de índice
ef_construction O tamanho da lista de candidatos dinâmicos mantida durante a construção do gráfico, que atualiza constantemente os melhores candidatos atuais para os vizinhos mais próximos de um nó. Defina este valor para qualquer valor superior ao dobro do valor m, por exemplo, 64(predefinição). Criação de índice
ef_search O tamanho da lista de candidatos dinâmicos usada durante a pesquisa. Pode começar a definir este valor como m ou ef_construction e, em seguida, alterá-lo enquanto observa a recolha. O valor predefinido é 40. Tempo de execução da consulta

Considere o exemplo seguinte que mostra um índice hnsw com os parâmetros de otimização definidos:

SET LOCAL hnsw.ef_search = 40;

CREATE INDEX my-hnsw-index ON my-table
  USING hnsw (vector_column cosine)
  WITH (m = 16, ef_construction = 200);

Analise as suas consultas

Use o comando EXPLAIN ANALYZE para analisar as estatísticas de consultas, conforme mostrado no seguinte exemplo de consulta SQL.

  EXPLAIN ANALYZE SELECT result-column
  FROM my-table
  ORDER BY EMBEDDING_COLUMN <=> embedding('text-embedding-005', 'What is a database?')::vector
  LIMIT 1;

A resposta de exemplo QUERY PLAN inclui informações como o tempo necessário, o número de linhas analisadas ou devolvidas e os recursos usados.

Limit  (cost=0.42..15.27 rows=1 width=32) (actual time=0.106..0.132 rows=1 loops=1)
  ->  Index Scan using my-scann-index on my-table  (cost=0.42..858027.93 rows=100000 width=32) (actual time=0.105..0.129 rows=1 loops=1)
        Order By: (embedding_column <=> embedding('text-embedding-005', 'What is a database?')::vector(768))
        Limit value: 1
Planning Time: 0.354 ms
Execution Time: 0.141 ms

Veja métricas do índice vetorial

Pode usar métricas do índice vetorial para rever o desempenho do índice vetorial, identificar áreas de melhoria e ajustar o índice com base nas métricas, se necessário.

Para ver todas as métricas do índice vetorial, execute a seguinte consulta SQL, que usa a vista pg_stat_ann_indexes:

SELECT * FROM pg_stat_ann_indexes;

Vê um resultado semelhante ao seguinte:

-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid                  | 271236
indexrelid             | 271242
schemaname             | public
relname                | t1
indexrelname           | t1_ix1
indextype              | scann
indexconfig            | {num_leaves=100,quantizer=SQ8}
indexsize              | 832 kB
indexscan              | 0
insertcount            | 250
deletecount            | 0
updatecount            | 0
partitioncount         | 100
distribution           | {"average": 3.54, "maximum": 37, "minimum": 0, "outliers": [37, 12, 11, 10, 10, 9, 9, 9, 9, 9]}
distributionpercentile |{"10": { "num_vectors": 0, "num_partitions": 0 }, "25": { "num_vectors": 0, "num_partitions": 30 }, "50": { "num_vectors": 3, "num_partitions": 30 }, "75": { "num_vectors": 5, "num_partitions": 19 }, "90": { "num_vectors": 7, "num_partitions": 11 }, "95": { "num_vectors": 9, "num_partitions": 5 }, "99": { "num_vectors": 12, "num_partitions": 4 }, "100": { "num_vectors": 37, "num_partitions": 1 }}

Para mais informações sobre a lista completa de métricas, consulte o artigo Métricas do índice vetorial.

O que se segue?