Ajusta el rendimiento de las consultas vectoriales en AlloyDB Omni

Selecciona una versión de la documentación:

En este documento, se describe cómo ajustar tus índices para lograr un rendimiento de consultas más rápido y una mejor recuperación en AlloyDB Omni.

Antes de comenzar

Antes de compilar un índice ScaNN, completa lo siguiente:

  • Asegúrate de que ya se haya creado una tabla con tus datos.
  • Para evitar problemas durante la generación del índice, asegúrate de que el valor que establezcas para la marca maintenance_work_mem y shared_buffers sea inferior a la memoria total de la máquina.
  • Para usar índices de cuatro niveles, primero debes habilitar la función de vista previa para tu instancia. Para habilitar la función de vista previa, elige uno de los siguientes dos métodos:

Ajusta un índice ScaNN

Usa la siguiente guía para determinar la cantidad de niveles necesarios para tu índice ScaNN:

  • Para entre 0 y 10 millones de filas, elige un índice de dos niveles.
  • Para entre 10 y 100 millones de filas, haz lo siguiente:
    • Para priorizar la recuperación de la búsqueda, elige un índice de dos niveles.
    • Para priorizar el tiempo de compilación del índice, elige un índice de tres niveles.
  • Para entre 100 millones y 1,000 millones de filas, haz lo siguiente:
    • Para priorizar la recuperación de la búsqueda, elige un índice de tres niveles.
    • Para priorizar el tiempo de compilación del índice, elige un índice de cuatro niveles (en vista previa).
  • Para entre 1,000 millones y 10,000 millones de filas, elige un índice de cuatro niveles (en vista previa).

Considera los siguientes ejemplos de índices ScaNN de dos, tres y cuatro niveles que muestran cómo se establecen los parámetros de ajuste para una tabla con 1,000,000 de filas:

Índice de dos niveles

SET LOCAL scann.num_leaves_to_search = 1;
SET LOCAL scann.pre_reordering_num_neighbors=50;

CREATE INDEX my-scann-index ON my-table
  USING scann (vector_column cosine)
  WITH (num_leaves = [power(1000000, 1/2)]);

Índice de tres niveles

SET LOCAL scann.num_leaves_to_search = 10;
SET LOCAL scann.pre_reordering_num_neighbors=50;

CREATE INDEX my-scann-index ON my-table
  USING scann (vector_column cosine)
  WITH (num_leaves = [power(1000000, 2/3)], max_num_levels = 2);

Índice de cuatro niveles

(en vista previa)

SET LOCAL scann.num_leaves_to_search = 100;
SET LOCAL scann.pre_reordering_num_neighbors=50;

CREATE INDEX my-scann-index ON my-table
  USING scann (vector_column cosine)
  WITH (num_leaves = [power(1000000, 3/4)], max_num_levels = 3);

Controla las invalidaciones de DML debido a la aceleración con el motor de columnas

Si elegiste acelerar tus búsquedas de vectores con el motor de columnas, ten en cuenta que las invalidaciones de DML y DDL en las tablas base pueden afectar el rendimiento de las consultas vectoriales. En caso de un alto rendimiento de DML, considera ajustar la marca de base de datos google_columnar_engine.refresh_threshold_percentage o actualizar el índice de forma manual con el comando google_columnar_engine_refresh_index.

Analiza tus consultas

Usa el comando EXPLAIN ANALYZE para analizar tus estadísticas de consultas, como se muestra en la siguiente consulta en SQL de ejemplo.

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

La respuesta de ejemplo QUERY PLAN incluye información como el tiempo transcurrido, la cantidad de filas analizadas o devueltas y los 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

Consulta las métricas del índice vectorial

Puedes usar las métricas del índice vectorial para revisar el rendimiento de tu índice vectorial, identificar áreas de mejora y ajustar el índice según las métricas, si es necesario.

Para ver todas las métricas del índice vectorial, ejecuta la siguiente consulta en SQL, que usa la vista pg_stat_ann_indexes:

SELECT * FROM pg_stat_ann_indexes;

Verás un resultado similar al siguiente:

-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid                  | 271236
indexrelid             | 271242
schemaname             | public
relname                | t1
indexrelname           | t1_ix1
indextype              | scann
indexconfig            | {num_leaves=100,max_num_levels=1,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 ver la cantidad de filas creadas en el momento de la creación del índice, ejecuta el siguiente comando:

SELECT * FROM pg_stat_ann_index_creation;

Verás un resultado similar al siguiente:

-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid                         | 271236
indexrelid                    | 271242
schemaname                    | public
relname                       | t1
indexrelname                  | t1_ix1
index_rows_at_creation_time   | 262144

Para obtener más información sobre la lista completa de métricas, consulta Métricas del índice vectorial.

¿Qué sigue?