Consulta cómo ajustar los siguientes índices vectoriales para conseguir un rendimiento de las consultas más rápido y una mejor recuperación en AlloyDB para PostgreSQL:
También puedes analizar tus consultas y ver las métricas de los índices vectoriales para monitorizar y mejorar el rendimiento de las consultas.
Antes de empezar
Antes de crear un índice ScaNN
, haz lo siguiente:
- Asegúrate de que ya se haya creado una tabla con tus datos.
- Para evitar problemas al generar el índice, asegúrese de que el valor que ha definido para las marcas
maintenance_work_mem
yshared_buffers
sea inferior a la memoria total del equipo .
Ajustar un índice de ScaNN
Sigue estas directrices para elegir entre un índice ScaNN de dos niveles y uno de tres:
- Elige un índice de dos niveles si el número de filas de vectores es inferior a 10 millones.
- Elige un índice de tres niveles si el número de filas de vectores supera los 100 millones.
- Elige un índice de tres niveles para optimizar el tiempo de compilación del índice o un índice de dos niveles para optimizar la recuperación de la búsqueda si el número de filas de vectores está entre 10 y 100 millones.
Considere los siguientes ejemplos de índices ScaNN
de dos y tres niveles que muestran cómo se definen los parámetros de ajuste de 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 = 1000); -- Note: 1000 is the square root of 1,000,000 rows.
Í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 = 10000, max_num_levels = 2);
Para optimizar el equilibrio entre la recuperación y las consultas por segundo al ajustar los índices de ScaNN, consulta las prácticas recomendadas para ajustar los índices de ScaNN.
Analizar las consultas
Usa el comando EXPLAIN ANALYZE
para analizar las estadísticas de tus consultas, tal como se muestra en la siguiente consulta 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 empleado, el número de filas analizadas o devueltas y los recursos utilizados.
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
Ver métricas de índice vectorial
Puede usar las métricas de índice vectorial para revisar el rendimiento de su índice vectorial, identificar áreas de mejora y ajustar su índice en función de las métricas, si es necesario.
Para ver todas las métricas del índice vectorial, ejecuta la siguiente consulta SQL, que usa la vista pg_stat_ann_indexes
:
SELECT * FROM pg_stat_ann_indexes;
Verá un resultado similar al siguiente:
-[ 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 obtener más información sobre la lista completa de métricas, consulta el artículo Métricas del índice de Vector.