Almacenar en caché tus índices en el motor de columnas entrega consultas directamente desde una representación en memoria optimizada para lectura del índice y aumenta la cantidad de consultas por segundo (QPS) que tu base de datos puede controlar para las cargas de trabajo de búsqueda de vectores.
Solo puedes usar HNSW con el motor de columnas para clústeres de AlloyDB Omni que ejecutan PostgreSQL 17 o versiones posteriores. ScaNN con el motor de columnas no tiene esa limitación.
Antes de comenzar
Configura las marcas de base de datos
google_columnar_engine.enabledygoogle_columnar_engine.enable_index_cachingenonpara habilitar el motor de columnas y su función de almacenamiento en caché de índices.Para configurar las marcas de base de datos, ejecuta el
ALTER SYSTEMcomando de PostgreSQL:ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_index_caching = 'on';Vuelve a cargar la configuración del administrador `systemd` y reinicia el servicio `alloydbomni` para que los cambios surtan efecto:
```posix-terminal sudo systemctl restart alloydbomni18Para obtener más información sobre la configuración de marcas, consulta Configura marcas de bases de datos.
Crea un índice de ScaNN o un índice de HNSW en tu base de datos.
Agrega un índice al motor de columnas
Después de habilitar el motor de columnas, puedes agregar un índice existente a la caché con la función de SQL google_columnar_engine_add_index().
Para agregar un índice al motor de columnas, ejecuta la siguiente consulta:
SELECT google_columnar_engine_add_index('INDEX_NAME');
Reemplaza INDEX_NAME por el nombre de tu índice de vectores.
Después de agregar un índice al motor de columnas, todas las consultas que usan este índice se aceleran automáticamente con el motor de columnas. Para verificar que el motor de columnas acelere tus consultas de vectores, usa el plan EXPLAIN (ANALYZE, COLUMNAR_ENGINE) en tu consulta.
Verifica el uso de la caché
Para verificar que el motor de columnas acelere tus consultas de vectores, usa el plan EXPLAIN (ANALYZE, COLUMNAR_ENGINE) en tu consulta.
Ejemplo de plan de ejecución de ScaNN
A continuación, se muestra un ejemplo de un plan de ejecución para una consulta que usa un índice de ScaNN que se agregó al motor de columnas:
EXPLAIN (ANALYZE TRUE, SCANN TRUE, COSTS FALSE, TIMING FALSE, SUMMARY FALSE, VERBOSE FALSE, COLUMNAR_ENGINE TRUE)
SELECT * FROM t ORDER BY val <=> '[0.5,0.5,0.5,0.5]' LIMIT 100;
--This contains details about ScaNN's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Index Scan using scann_idx on t t_1 (actual rows=100 loops=1)
Order By: (val <=> '[0.5,0.5,0.5,0.5]'::vector)
Limit: 100
ScaNN Info: (... columnar engine nodes hit=6...)
Columnar Engine ScaNN Info: (index found=true)
(5 rows)
La presencia de columnar engine nodes hit y Columnar Engine ScaNN Info:
(index found=true) en el resultado confirma que el motor de columnas se usa para
la consulta.
Ejemplo de plan de ejecución de HNSW
El plan de ejecución muestra la sección Columnar Engine HNSW Info para el índice respectivo que muestra métricas como la proporción de elementos recuperados del motor de columnas (elements_from_ce) y del disco (elements_from_disk).
A continuación, se muestra un ejemplo de un plan de ejecución para una consulta que usa un índice de HNSW que se agregó al motor de columnas:
EXPLAIN (ANALYZE, COLUMNAR_ENGINE) SELECT * FROM documents ORDER BY embedding <=> '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector LIMIT 5;
--This contains details about HNSW's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Limit (actual rows=5 loops=1)
-> Index Scan using hnsw_idx on documents (actual rows=5 loops=1)
Order By: (embedding '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector)
Columnar Engine HNSW Info: (index found=true elements_from_ce=385 elements_from_disk=0)
Columnar Check: table is not in the columnar store
(5 rows)
La respuesta muestra que el motor de columnas acelera el índice, ya que todos los elementos se recuperaron del motor de columnas (elements_from_ce=385) y ninguno se recuperó del disco (elements_from_disk=0).
Cuando las modificaciones de datos, como las sentencias INSERT, UPDATE o DELETE, invalidan las entradas de caché, el motor de columnas usa un enfoque híbrido para mantener la exactitud y el rendimiento. Lee vectores válidos y almacenados en caché directamente desde la memoria y recupera solo los vectores modificados o nuevos del disco.
Si modificas una gran cantidad de datos, es posible que veas temporalmente un aumento en elements_from_disk y una disminución en el rendimiento hasta que se actualice la caché.
Administra el índice almacenado en caché
Para administrar el ciclo de vida de tus índices almacenados en caché, ejecuta el comando SQL para la tarea seleccionada:
Para actualizar la caché de forma manual, ejecuta el siguiente comando:
SELECT google_columnar_engine_refresh_index('INDEX_NAME');Para verificar el estado del índice, ejecuta el siguiente comando:
SELECT google_columnar_engine_verify('INDEX_NAME');Para quitar el índice de la caché, ejecuta el siguiente comando:
SELECT google_columnar_engine_drop_index('INDEX_NAME');Para ver los índices activos, ejecuta el siguiente comando:
SELECT * FROM g_columnar_indexes;Para ver los índices particionados, ejecuta el siguiente comando:
SELECT * FROM g_columnar_index_partitions;
Reemplaza INDEX_NAME por el nombre de tu índice.
Limitaciones
La actualización de los índices de HNSW acelerados por el motor de columnas puede consumir temporalmente memoria hasta dos veces el tamaño del índice.
¿Qué sigue?
- Crea índices y consulta vectores con ScaNN
- Descripción general del motor de columnas
- Administra columnas de forma manual
- Realiza la búsqueda de vectores