Acelera la búsqueda de vectores con el motor de columnas

Puedes usar el motor de columnas de AlloyDB para PostgreSQL para acelerar tus búsquedas de vectores cuando usas el índice de vecinos más cercanos escalables (ScaNN) o el índice de mundo pequeño navegable jerárquico (HNSW). El motor de columnas actúa como una caché en memoria optimizada para la lectura de estos índices de vectores.

El almacenamiento en caché de tus índices en el motor columnar entrega las consultas directamente desde una representación del índice optimizada para la lectura y en la memoria, 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 los clústeres de AlloyDB que ejecutan PostgreSQL 17 o versiones posteriores. ScaNN con el motor de columnas no tiene esa limitación.

Antes de comenzar

  • Establece las marcas de base de datos google_columnar_engine.enabled y google_columnar_engine.enable_index_caching en on para habilitar el motor de columnas y su función de almacenamiento en caché de índices.

    gcloud alloydb instances update INSTANCE_ID \
        --database-flags google_columnar_engine.enabled=on,google_columnar_engine.enable_index_caching=on \
        --region=REGION \
        --cluster=CLUSTER_ID \
        --project=PROJECT_ID

    Reemplaza lo siguiente:

    • INSTANCE_ID: Es el ID de la instancia en la que deseas habilitar el motor de columnas.
    • REGION: Es la región en la que se encuentra tu instancia, por ejemplo, us-central1.
    • CLUSTER_ID: Es el ID del clúster en el que se encuentra tu instancia.
    • PROJECT_ID: Es el ID del proyecto en el que se encuentra tu clúster.

    Para obtener más información sobre cómo configurar marcas, consulta Configura marcas de base 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 google_columnar_engine_add_index() de SQL.

Para agregar un índice al motor de columnas, sigue estos pasos:

  1. En la consola de Google Cloud , ve a la página Clústeres.

    Ir a los clústeres

  2. Para mostrar la página Descripción general del clúster, haz clic en el nombre del clúster de AlloyDB en la columna Nombre del recurso.

  3. En el panel de navegación, haz clic en AlloyDB Studio.

  4. Accede a AlloyDB Studio con el nombre de tu base de datos, tu nombre de usuario y tu contraseña.

  5. En la pestaña Editor 1, ingresa la siguiente consulta:

    SELECT google_columnar_engine_add_index('INDEX_NAME');
    

    Reemplaza INDEX_NAME por el nombre de tu índice de vectores.

    1. Haz clic en Ejecutar.

Después de agregar un índice al motor de columnas, todas las consultas que lo usen se acelerarán automáticamente con el motor de columnas. Puedes verificar que el motor de columnas acelere tus consultas vectoriales con el plan EXPLAIN (ANALYZE, COLUMNAR_ENGINE) en tu consulta.

Verifica el uso del almacenamiento en caché

Para verificar que el motor de columnas acelere tus consultas de vectores, puedes usar 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 se usa el motor de columnas 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 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 instrucciones INSERT, UPDATE o DELETE, invalidan las entradas de la caché, el motor de columnas usa un enfoque híbrido para mantener la precisión y el rendimiento. Lee vectores válidos almacenados en caché directamente desde la memoria y solo recupera los vectores nuevos o modificados 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é, sigue estos pasos:

  1. En la consola de Google Cloud , ve a la página Clústeres.

    Ir a los clústeres

  2. Para mostrar la página Descripción general del clúster, haz clic en el nombre del clúster de AlloyDB en la columna Nombre del recurso.

  3. En el panel de navegación, haz clic en AlloyDB Studio.

  4. Accede a AlloyDB Studio con el nombre de tu base de datos, tu nombre de usuario y tu contraseña.

  5. En la pestaña Editor 1, ingresa 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.

  6. Haz clic en Ejecutar.

Limitaciones

La actualización de los índices HNSW acelerados por el motor de columnas puede consumir temporalmente memoria hasta dos veces el tamaño del índice.

¿Qué sigue?