Información sobre el filtrado adaptable en AlloyDB AI

En esta página, se proporciona una descripción general conceptual del filtrado adaptable en AlloyDB AI, una función diseñada para optimizar las búsquedas de vectores filtradas.

¿Qué es el filtrado adaptable?

El filtrado adaptable analiza los patrones de consultas y las distribuciones de datos durante la ejecución de la consulta para elegir de forma dinámica la estrategia de filtrado más eficiente, como el filtrado intercalado o previo.

El optimizador de consultas de AlloyDB AI usa el análisis basado en costos para determinar si el filtrado intercalado o previo proporciona el mejor rendimiento en un momento determinado durante la ejecución de la consulta.

Este tipo de optimización admite las búsquedas de vectores filtradas de AlloyDB AI, en las que el filtrado adaptable cambia automáticamente entre el uso de vectores y el índice de metadatos, lo que produce resultados eficientes y precisos sin intervención manual.

Cambio dinámico entre estrategias de filtrado

El filtrado adaptable cambia de forma automática y dinámica entre las estrategias de filtrado intercalado y previo durante la ejecución de la consulta en función de los patrones de consultas y las distribuciones de datos en tiempo real. El optimizador de consultas de AlloyDB AI usa el análisis basado en costos para determinar qué estrategia proporciona el mejor rendimiento en un momento determinado.

Del filtrado intercalado al previo

Cuando el optimizador determina que el filtrado previo es más eficiente, el filtrado adaptable activa un cambio del filtrado intercalado al previo durante la ejecución. El plan de consultas cambia de forma dinámica para reflejar esto.

Por ejemplo, el plan puede mostrar Bitmap assisted pre-filtering en el campo Execution Strategy cuando el optimizador determina que el filtrado previo es más eficiente en ese punto de la consulta. Este cambio dinámico se produce a medida que el sistema se adapta a los datos reales que encuentra durante la ejecución de la consulta.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted pre-filtering
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

Cuando se usa Execution Strategy: Bitmap assisted pre-filtering, un Bitmap Index Scan independiente primero filtra un conjunto de datos grande. Si este filtrado previo reduce de manera eficaz los candidatos, el índice de vectores no se usa para la búsqueda final de similitud de vectores.

Del filtrado previo al intercalado

El filtrado adaptable también puede cambiar de forma dinámica del filtrado previo al intercalado si el optimizador de consultas de AlloyDB AI determina que el filtrado intercalado es más eficiente para las características de la consulta actual.

En esos casos, el plan de consultas se ajusta de forma dinámica para reflejar un procesamiento más directo de los datos vectoriales sin un paso de filtrado previo explícito que preceda al análisis de vectores. Esta adaptabilidad ayuda a lograr un rendimiento óptimo a medida que cambian las distribuciones de datos o los parámetros de consulta durante el tiempo de ejecución.

Por ejemplo, el plan de consultas muestra vector scan en el campo Execution Strategy cuando el optimizador determina que una estrategia de filtrado intercalado es más eficiente para la consulta determinada.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted vector Scan on scann_idx
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        Num Requalifications: 0
        Num filtered: 1000
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

En este ejemplo, la Execution Strategy muestra Bitmap assisted vector Scan on scann_idx, con un Bitmap Index Scan subyacente en btree_idx. Esto indica que la búsqueda de vectores usa un filtro de mapa de bits, que el análisis de índice de mapa de bits genera en función de la condición int_col <= 100000000. Luego, el Custom Scan (vector scan) procesa solo las filas identificadas por este mapa de bits, y la integración del filtrado se realiza directamente en el proceso de análisis de vectores.

Ejemplo: Cómo la selectividad activa un cambio dinámico

El filtrado adaptable basa sus decisiones en la selectividad de tus filtros estándar. Si un filtro elimina una gran cantidad de datos, es probable que el optimizador elija el filtrado previo. Si el filtro deja la mayoría de los datos intactos, es probable que el optimizador elija el filtrado intercalado.

Puedes observar este cambio dinámico en tiempo real ejecutando la misma consulta y ajustando la selectividad de tu cláusula WHERE.

Por ejemplo, cuando consultas una tabla grande de productos minoristas, es posible que desees realizar una búsqueda de vectores solo en los artículos que tengan un precio específico.

Baja selectividad

Primero, buscas productos por debajo de USD 1,000. Debido a que casi todos los productos de la base de datos están por debajo de USD 1,000, el filtro tiene baja selectividad. El optimizador de consultas de AlloyDB AI determina que recopilar casi toda la base de datos en una lista filtrada previamente es ineficiente, por lo que realiza un análisis de vectores intercalado.

Si observas el plan de consultas, verás que el sistema se adaptó de forma dinámica al conjunto de datos masivo y eligió el filtrado intercalado.

  Limit (actual rows=10)
    -> Custom Scan (vector scan)
    Execution Strategy: Bitmap assisted vector Scan on scann_idx
    Order By: (vec <=> '[...]'::vector)
    -> Bitmap Index Scan
       Index Cond: (price <= 1000)

Alta selectividad

A continuación, cambias la consulta para buscar productos por debajo de USD 10. A medida que comienza a ejecutarse la consulta, el optimizador de consultas de AlloyDB AI se prepara inicialmente para usar el filtrado intercalado. El planificador supone de forma incorrecta que el filtro no es muy selectivo. Esto sucede con más frecuencia de lo esperado porque las estadísticas que se usan para hacer estas estimaciones no siempre son precisas ni están actualizadas. Sin embargo, determina rápidamente que el filtro de precio tiene una alta selectividad: muy pocos artículos de la base de datos tienen un precio tan bajo. El optimizador determina que recopilar estas pocas filas antes de realizar el análisis de vectores es mucho más rápido, por lo que cambia de forma dinámica las estrategias al filtrado previo.

El plan de consultas refleja esta reorientación en tiempo real. El sistema eligió filtrar previamente el conjunto de datos pequeño antes de analizar los vectores.

Elección inicial del planificador

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted vector Scan on scann_idx
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

Ejecución real (cambio adaptable)

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted pre-filtering
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

No es necesario volver a escribir el código de la aplicación ni actualizar manualmente los índices de la base de datos a medida que cambia la distribución de datos con el tiempo. AlloyDB AI controla la lógica de enrutamiento por ti en cada consulta, lo que garantiza un alto rendimiento.

¿Qué sigue?