使用列式引擎加速向量搜索

选择文档版本:

使用可扩容的最近邻 (ScaNN) 或分层可导航小世界 (HNSW) 索引时,您可以使用 AlloyDB Omni 列式引擎来加速向量搜索。列式引擎充当这些向量索引的读取优化型内存缓存。

在列式引擎中缓存索引可以直接从索引的读取优化型内存表示形式提供查询,并增加数据库可以处理的向量搜索工作负载的每秒查询次数 (QPS)。

您只能将 HNSW 与列式引擎搭配用于运行 PostgreSQL 17 或更高版本的 AlloyDB Omni 集群。ScaNN 与列式引擎搭配使用没有此类限制。

准备工作

  • google_columnar_engine.enabledgoogle_columnar_engine.enable_index_caching 数据库标志设置为 on,以启用列式引擎及其索引缓存功能。

    如需设置数据库标志,请运行 ALTER SYSTEM PostgreSQL 命令:

    ALTER SYSTEM SET google_columnar_engine.enabled = 'on';
    ALTER SYSTEM SET google_columnar_engine.enable_index_caching = 'on';
    

    重新加载 `systemd` 管理器配置并重启 `alloydbomni` 服务,以使更改生效: ```posix-terminal sudo systemctl restart alloydbomni18

    如需详细了解如何设置标志,请参阅配置数据库标志

  • 在数据库中创建 ScaNN 索引创建 HNSW 索引

将索引添加到列式引擎

启用列式引擎后,您可以使用 google_columnar_engine_add_index() SQL 函数将现有索引添加到缓存。

如需将索引添加到列式引擎,请运行以下查询:

SELECT google_columnar_engine_add_index('INDEX_NAME');

INDEX_NAME 替换为向量索引的名称。

将索引添加到列式引擎后,所有使用此索引的查询都会自动由列式引擎加速。您可以使用查询中的 EXPLAIN (ANALYZE, COLUMNAR_ENGINE) 计划来验证向量查询是否由列式引擎加速。

验证缓存使用情况

如需验证向量查询是否由列式引擎加速,您可以使用查询中的 EXPLAIN (ANALYZE, COLUMNAR_ENGINE) 计划。

ScaNN 执行计划示例

以下是使用已添加到列式引擎的 ScaNN 索引的查询的执行计划示例:

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)

如果输出中存在 columnar engine nodes hitColumnar Engine ScaNN Info: (index found=true),则表示列式引擎用于 查询。

HNSW 执行计划示例

执行计划会显示相应索引的 Columnar Engine HNSW Info 部分,其中显示了从列式引擎检索的元素比例 (elements_from_ce) 和从磁盘检索的元素比例 (elements_from_disk) 等指标。

以下是使用已添加到列式引擎的 HNSW 索引的查询的执行计划示例:

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)

响应显示索引由列式引擎加速,因为所有元素都是从列式引擎检索的 (elements_from_ce=385),没有从磁盘检索任何元素 (elements_from_disk=0)。

INSERTUPDATEDELETE 语句等数据修改操作使缓存条目失效时,列式引擎会使用混合方法来保持准确性和性能。它会直接从内存中读取有效的缓存向量,并且仅从磁盘中提取修改后的向量或新向量。

如果您修改大量数据,您可能会暂时看到 elements_from_disk 增加,并且性能下降,直到缓存刷新为止。

管理缓存的索引

如需管理缓存的索引的生命周期,请针对所选任务运行 SQL 命令:

  • 如需手动刷新缓存,请运行以下命令:

    SELECT google_columnar_engine_refresh_index('INDEX_NAME');
    
  • 如需验证索引状态,请运行以下命令:

    SELECT google_columnar_engine_verify('INDEX_NAME');
    
  • 如需从缓存中删除索引,请运行以下命令:

    SELECT google_columnar_engine_drop_index('INDEX_NAME');
    
  • 如需查看活跃索引,请运行以下命令:

    SELECT * FROM g_columnar_indexes;
    
  • 如需查看分区索引,请运行以下命令:

    SELECT * FROM g_columnar_index_partitions;
    

INDEX_NAME 替换为索引的名称。

限制

刷新列式引擎加速的 HNSW 索引可能会暂时消耗高达索引大小两倍的内存。

后续步骤