En esta página, se proporciona una descripción general conceptual del filtrado adaptativo en AlloyDB AI, una función diseñada para optimizar las búsquedas de vectores filtrados.
¿Qué es el filtrado adaptable?
El filtrado adaptable analiza los patrones de búsqueda y las distribuciones de datos durante la ejecución de la búsqueda para elegir de forma dinámica la estrategia de filtrado más eficiente, como el filtrado previo o el filtrado intercalado.
El optimizador de consultas de IA de AlloyDB usa el análisis basado en costos para determinar si el filtrado intercalado o el filtrado previo proporcionan el mejor rendimiento en cualquier momento durante la ejecución de la consulta.
Este tipo de optimización admite las búsquedas vectoriales filtradas de AlloyDB AI, en las que el filtrado adaptable cambia automáticamente entre el uso del índice de vectores y el de metadatos, lo que produce resultados eficientes y precisos sin intervención manual.
Cambio dinámico entre estrategias de filtrado
El filtrado adaptativo cambia de forma automática y dinámica entre las estrategias de filtrado intercalado y de prefiltrado durante la ejecución de la consulta en función de los patrones de consulta y las distribuciones de datos en tiempo real. El optimizador de consultas basado en IA de AlloyDB usa el análisis basado en costos para determinar qué estrategia proporciona el mejor rendimiento en cualquier momento.
De la visualización intercalada al prefiltrado
Cuando el optimizador determina que el prefiltrado es más eficiente, el filtrado adaptable activa un cambio del filtrado intercalado al prefiltrado 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 Estrategia de ejecución 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 búsqueda.
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, primero un Bitmap Index Scan independiente filtra un conjunto de datos grande. Si este filtrado previo reduce de manera eficaz la cantidad de candidatos, no se usa el índice de vectores para la búsqueda final de similitud de vectores.
Del prefiltrado al filtrado intercalado
El filtrado adaptable también puede cambiar de forma dinámica del prefiltrado al filtrado en línea si el optimizador de consultas de IA de AlloyDB determina que el filtrado en línea 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 prefiltrado 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 Estrategia de ejecución 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, el 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 la operación Bitmap Index Scan genera en función de la condición int_col <= 100000000. Luego, Custom Scan (vector scan) solo procesa las filas identificadas por este mapa de bits, lo que integra el filtrado 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 prefiltrado. Si el filtro deja la mayor parte 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, buscarás productos por menos de USD 1,000. Dado que casi todos los productos de la base de datos cuestan menos de USD 1,000, el filtro tiene una baja selectividad. El optimizador de consultas de AlloyDB AI determina que recopilar casi toda la base de datos en una lista previa filtrada 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, cambia la búsqueda para encontrar productos por menos de USD 10. Cuando comienza la ejecución de la consulta, el optimizador de consultas de IA de AlloyDB se prepara inicialmente para usar el filtrado intercalado. El planificador supone incorrectamente 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 elementos de la base de datos tienen este 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 prefiltrado.
El plan de consulta refleja este cambio en tiempo real. El sistema optó por 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 (interruptor 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 que vuelvas a escribir el código de tu aplicación ni que actualices manualmente los índices de la base de datos a medida que cambia la distribución de tus datos con el tiempo. AlloyDB AI controla la lógica de enrutamiento por ti en cada consulta, lo que garantiza un alto rendimiento.