本页面从概念上简要介绍了 AlloyDB AI 中的自适应过滤功能,该功能旨在优化过滤式向量搜索。
什么是自适应过滤?
自适应过滤会在查询执行期间分析查询句式和数据分布,以动态选择最有效的过滤策略,例如内嵌过滤或预过滤。
AlloyDB AI 查询优化器使用基于成本的分析,来确定在查询执行期间的任何给定时间点,是内嵌过滤还是预过滤能够提供最佳性能。
此类优化支持 AlloyDB AI 的过滤式向量搜索,其中自适应过滤会在向量和元数据索引用法之间自动切换,无需人工干预即可高效准确地获得结果。
在过滤策略之间动态切换
自适应过滤会在查询执行期间根据实时查询模式和数据分布,自动动态地在内嵌过滤和预过滤策略之间切换。AlloyDB AI 查询优化器使用基于成本的分析,来确定在任何给定时间点哪种策略能够提供最佳性能。
从内嵌过滤到预过滤
当优化器确定预过滤效率更高时,自适应过滤会在执行期间触发从内嵌过滤到预过滤的切换。查询计划会动态更改以反映这一点。
例如,当优化器确定在查询的该时间点预过滤效率更高时,该方案可能会在执行策略字段中显示 Bitmap assisted pre-filtering
。当系统适应在查询执行期间遇到的实际数据时,就会发生此动态变化。
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)
使用 Execution Strategy: Bitmap assisted pre-filtering
时,单独的 Bitmap Index Scan
会先过滤大型数据集。如果此预过滤有效地缩小了候选范围,则向量索引不会用于最终的向量相似度搜索。
从预过滤到内嵌过滤
如果 AlloyDB AI 查询优化器确定内嵌过滤对于当前查询特征更有效,自适应过滤还可以动态地从预过滤切换到内嵌过滤。
在这种情况下,查询计划会动态调整,以更直接地处理向量数据,而无需在向量扫描之前执行明确的预过滤步骤。这种适应性有助于在运行时数据分布或查询参数发生变化时实现最佳性能。
例如,当优化器确定内嵌过滤策略对于指定查询更高效时,查询计划会在执行策略字段中显示 vector scan
。
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)
在此示例中,Execution Strategy
显示 Bitmap assisted vector Scan on scann_idx
,底层 Bitmap Index Scan
位于 btree_idx
上。这表示向量搜索使用位图过滤条件,该过滤条件由位图索引扫描根据 int_col <= 100000000
条件生成。然后,Custom Scan (vector scan)
仅处理此位图标识的行,直接将过滤集成到向量扫描过程中。