维护向量索引

选择文档版本:

为确保向量索引能够适应可能影响搜索结果准确率的变化,请维护向量索引。

准备工作

在管理索引维护之前,请安装或更新 vectoralloydb_scann 扩展程序:

  • 如果未安装 vectoralloydb_scann 扩展程序,请安装它们。

    CREATE EXTENSION IF NOT EXISTS vector;
    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    
  • 如果已安装 vectoralloydb_scann 扩展程序,请更新它们。

    ALTER EXTENSION vector UPDATE;
    ALTER EXTENSION alloydb_scann UPDATE;
    

自动维护索引

您可以让 AlloyDB Omni 自动管理向量索引。随着数据集的增长,AlloyDB Omni 会分析和更新质心,并拆分大型离群值分区。这会自动提高每秒查询次数 (QPS) 和搜索结果质量。在下次维护运行之前,所有自动更新都是永久性的。

AlloyDB Omni 默认会为 自动调优的 ScaNN 索引启用自动索引维护。 如果您想创建自动调优的 ScaNN 索引,但停用自动 维护,请参阅 为自动索引停用自动维护

如需为手动创建的索引启用自动维护,请参阅 在创建索引期间启用自动维护

在创建索引期间启用自动维护

如需在创建索引期间启用自动维护,请将 auto_maintenance 参数设置为 on。例如,请参阅以下用于创建 ScaNN 向量索引的命令。

CREATE INDEX INDEX_NAME ON TABLE_NAME \
USING scann (EMBEDDING_COLUMN_NAME DISTANCE_FUNCTION_NAME) \
WITH (mode='INDEX_MODE', num_leaves=NUM_PARTITIONS, auto_maintenance=on);

执行以下变量替换操作:

  • INDEX_NAME:您要创建的索引的名称。例如,my_scann_index。索引名称会在整个数据库中共享。确保每个索引名称对数据库中的每个表中都是唯一的。

  • TABLE_NAME:您要向其中添加索引的表。

  • EMBEDDING_COLUMN_NAME:存储您要编制索引的 vector 数据的列。

  • DISTANCE_FUNCTION_NAME:要与此索引一起使用的距离函数。请按以下方式之一操作:

    • L2 距离:l2

    • 点积:dot_product

    • 余弦距离cosine

  • INDEX_MODE:用于创建 ScaNN 索引的模式。可用值如下所示:

    • AUTO:AlloyDB Omni 会自动管理和调优索引的结构。当 mode 设置为 AUTO 时,默认的 auto_maintenance 值为 on

    • MANUAL:手动管理和调优 ScaNN 索引。当 mode 设置为 MANUAL 时,默认的 auto_maintenance 值为 off

    如需详细了解要使用哪种索引模式,请参阅 创建 ScaNN 索引

  • NUM_PARTITIONS:要应用于此索引的分区数。将此值设置为介于 31048576 之间的任意值。如需详细了解如何确定此值,请参阅 调优 ScaNN 索引

为现有索引配置自动维护

如需为现有手动索引配置自动维护,请运行以下命令:

ALTER INDEX INDEX_NAME SET (auto_maintenance = AUTOMATIC_MAINTENANCE);

执行以下变量替换操作:

  • INDEX_NAME:您要更改的索引的名称。例如,my_scann_index

  • AUTOMATIC_MAINTENANCE:启用或停用自动维护。如需启用,请将值设置为 on。 如需停用,请将值设置为 off

提高自动维护吞吐量

如需提高自动维护吞吐量,请配置 scann.max_background_workers 数据库标志。增加后台工作器的数量会增加单位时间内处理的索引数量。它不会缩短单个索引的处理时间。此值必须小于为数据库集群设置的 max_worker_processes 值。

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

增加自动维护延迟时间

如需增加自动维护运行之间的延迟时间,请配置 scann.maintenance_background_naptime_s 数据库标志。

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

搜索分区百分比

随着 AlloyDB Omni 自动拆分大型离群值分区导致分区数量的增加,我们建议您调整要搜索的叶数量,以保持最佳性能。如需自动管理此数量,请配置 scann.pct_leaves_to_search 参数。

scann.pct_leaves_to_search 表示要搜索的当前分区所占的百分比。您可以将此参数设置为介于 0100 之间的任意值。默认值为 0,这会停用此参数,并改用 scann.num_leaves_to_search 中设置的值。如果 scann.num_leaves_to_search 也设置为 0,则 AlloyDB Omni 默认会使用 1% 的叶。

如果您预计数据集会显著增长,请将初始值设置为 1

如需设置 scann.pct_leaves_to_search,请运行以下命令:

ALTER DATABASE DB_NAME SET scann.pct_leaves_to_search = PERCENTAGE_PARTITIONS_TO_SEARCH;

执行以下变量替换操作:

  • DB_NAME:您的数据库的名称。
  • PERCENTAGE_PARTITIONS_TO_SEARCH:要搜索的分区所占的百分比。

手动调用索引维护

如果您想手动对特定索引调用维护,请运行以下命令:

SELECT scann_index_maintenance('INDEX_NAME');

INDEX_NAME 替换为您要对其调用维护的索引的名称。例如,my_scann_index

为自动索引停用自动维护

如需为自动调优的 ScaNN 索引停用自动维护,请在创建索引期间将 auto_maintenance 参数设置为 OFF。例如,请参阅以下用于创建自动调优的 ScaNN 索引的命令:

CREATE INDEX similarity_index ON products
       USING scann (description_embedding cosine)
WITH (MODE = 'AUTOMATIC', auto_maintenance = 'OFF');

如果您想对现有自动调优的 ScaNN 索引停用自动维护,请参阅 为现有索引配置自动维护

手动重建索引

如果您的表容易频繁更新或插入,我们建议您定期重建 ScaNN 索引,以提高其召回率准确率。如需详细了解如何查看自构建索引以来向量分布或变更的变化,请参阅 查看向量索引指标

如需使用原始配置手动重建索引,请运行以下命令:

REINDEX INDEX CONCURRENTLY INDEX_NAME;

INDEX_NAME 替换为您要重建的索引的名称。例如,my_scann_index

如需详细了解如何在 PostgreSQL 中重新编制索引,请参阅 REINDEX

后续步骤