En este documento, se proporcionan recomendaciones para optimizar el rendimiento de la búsqueda de vectores en Spanner.
Comprende los conceptos básicos de Spanner
Para realizar pruebas de rendimiento efectivas de la búsqueda de vectores de Spanner, comprende los conceptos básicos de Spanner. Por ejemplo, volver a ejecutar la misma consulta de inmediato puede ser más rápido debido a las memorias caché. Para probar el rendimiento en una aplicación que usa principalmente datos activos, primero realiza una lectura de calentamiento.
Consulta las siguientes guías:
- Resumen del rendimiento
- Prácticas recomendadas sobre SQL
- Realiza una búsqueda de k‑vecino más cercano (KNN)
- Realiza una búsqueda de vecino más cercano aproximado (ANN) con índices de vectores
- Prácticas recomendadas para la indexación de vectores
Spanner procesa las consultas en paralelo según las divisiones de la base de datos. Las pruebas con una carga de consultas de producción sostenida pueden habilitar la división basada en la carga, lo que mejora el rendimiento de las consultas a través de un mayor paralelismo. Para aumentar el paralelismo para la carga futura, considera dividir previamente tu base de datos, en especial para KNN.
Prácticas recomendadas para la búsqueda de vectores
En este documento, se describen las siguientes prácticas recomendadas para la búsqueda de vectores:
- Anota la columna de incorporación
- Usa una consulta de k superior
- Usa literales de SQL para la cláusula
LIMIT - Usa el análisis orientado a lotes
- Usa KNN para conjuntos de datos pequeños
- Usa ANN para conjuntos de datos grandes
Anota la columna de incorporación
Anota la columna de incorporación con
vector_length.
Esta anotación habilita las optimizaciones de rendimiento para
la búsqueda de k‑vecino más cercano (KNN) y es
un requisito previo para la búsqueda de vecino más cercano aproximado (ANN).
Usa una consulta de k superior
Para encontrar los vecinos más cercanos, usa una cláusula ORDER BY con LIMIT. Las consultas de k superior están altamente optimizadas para la búsqueda de vectores. Evita filtrar por un umbral de distancia en una cláusula WHERE.
Por ejemplo, no se recomienda lo siguiente:
SELECT d.DocId
FROM Documents AS d
WHERE COSINE_DISTANCE(d.DocEmbedding, @vector) < 1;
En su lugar, usa lo siguiente:
SELECT d.DocId
FROM Documents AS d
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;
Usar una consulta de k superior no solo es más simple porque elimina el ajuste del umbral de distancia, sino que también habilita las optimizaciones de rendimiento especializadas para la búsqueda de vectores.
Usa literales de SQL para la cláusula LIMIT
Si el límite de k superior es fijo, usa un literal de SQL en lugar de un parámetro. Por ejemplo, usa LIMIT 10 en lugar de LIMIT @limit. Esto proporciona al
optimizador de consultas
de Spanner más información para seleccionar el mejor
plan de ejecución de consultas.
Usa el análisis orientado a lotes
Las consultas de búsqueda de vectores son muy pesadas. Para las consultas de KNN, considera usar
el análisis orientado a lotes con la
scan_method=batch sugerencia de consulta.
Este es el método de análisis predeterminado para las consultas de ANN.
Usa KNN para conjuntos de datos pequeños
Si KNN es suficiente para tu presupuesto de latencia, no crees un índice de vectores. KNN es más preciso, evita la creación y los costos de mantenimiento de índices, y puede tener un mejor rendimiento que ANN cuando la cantidad de filas de entrada después de cualquier filtrado es pequeña.
Acelera el KNN filtrado con un índice secundario
Para mejorar el rendimiento de una consulta de KNN filtrada, crea un índice secundario en la columna de filtrado. Por ejemplo, considera la siguiente consulta:
SELECT d.DocId
FROM Documents AS d
WHERE Category = 'toy'
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;
Si la cantidad de documentos por categoría es inferior a unas decenas de miles y tu aplicación puede aceptar una latencia de consulta de 100 ms, crea un índice secundario en la columna Category. Almacena la columna DocEmbedding en el índice:
CREATE INDEX ON Documents(Category) STORING (DocEmbedding);
Esta creación de índice ayuda a acelerar la consulta filtrada.
Usa ANN para conjuntos de datos grandes
Si la cantidad de filas es grande después de evaluar los filtros, crea un índice de vectores y usa la búsqueda de ANN. Existen varias técnicas que pueden acelerar el filtrado con ANN:
Almacena columnas de filtrado: Para habilitar el filtrado mientras se atraviesa la búsqueda de vectores, almacena las columnas de filtrado en el índice de vectores. Esto permite que las filas no calificadas se quiten al principio de la ejecución.
CREATE VECTOR INDEX ON Documents(DocEmbedding) STORING(Category);Columnas de filtrado de claves: Para acelerar el filtrado de columnas altamente selectivas que quitan muchos resultados, organiza estas columnas como columnas de claves adicionales en el índice de vectores. Las consultas que especifican igualdad exacta (con el operador
=) para estas claves adicionales se aceleran más. Usar la cláusulaINpara cualquiera de estas claves adicionales no logra el mismo nivel de aceleración.CREATE VECTOR INDEX ON Documents(DocEmbedding, Category);Evita almacenar columnas grandes o usarlas como claves: Si lo haces, es posible que se diluyan los bloques de datos para las incorporaciones, lo que podría reducir la eficiencia de lectura. Como alternativa, considera usar una columna hash en el índice y usa la columna grande original como un filtro posterior después de k superior.
Crea un índice de vectores filtrado (parcial):Si solo consultas un subconjunto del conjunto de datos y una condición de filtrado define ese subconjunto, como
Category = "Tech", crea un índice de vectores filtrado o parcial.