维护向量索引

本页介绍了维护向量索引的选项。维护索引有助于确保索引能够适应可能影响搜索结果准确率的数据变化。随着数据集不断增长,请使用本页面中的策略来避免查询性能下降。

准备工作

  • 安装或更新 vectoralloydb_scann 扩展程序。

    1. 如果未安装 vectoralloydb_scann 扩展程序,请安装最新的扩展程序版本。

      CREATE EXTENSION IF NOT EXISTS vector;
      CREATE EXTENSION IF NOT EXISTS alloydb_scann;
      
    2. 如果 vectoralloydb_scann 扩展程序已安装,请将这些扩展程序升级到最新版本。

      ALTER EXTENSION vector UPDATE;
      ALTER EXTENSION alloydb_scann UPDATE;
      

查看向量索引指标

如果您的表容易频繁更新或插入,我们建议您定期重新编制现有的 ScaNN 索引,以提高索引的召回率准确率。您可以监控索引指标,以查看自构建索引以来向量分布或向量变更的变化,然后相应地重新编制索引。

如需详细了解指标,请参阅查看向量索引指标

自动维护索引

借助自动索引维护功能,AlloyDB 可以逐步管理索引,以便在数据集不断增长时,AlloyDB 能够持续分析和更新质心,并拆分大型离群值分区。这有助于保持每秒可比较的查询次数 (QPS) 和搜索结果质量。自动维护所做的任何更新都是永久性的,直到下一次维护运行。

在创建 ScaNN 索引时,您可以使用 scann.enable_preview_features 数据库标志 (GUC) 以及索引级 auto_maintenance 参数,以启用 ScaNN 索引的自动索引维护功能。

对于自动调优的 ScaNN 索引,系统默认启用自动索引维护功能。对于手动创建的索引,启用 scann.enable_preview_features 标志后,您可以在创建索引期间设置 auto_maintenance 参数,也可以使用 scann_index_maintenance 函数按需触发自动索引维护。

如需让 AlloyDB 自动维护索引,请启用 scann.enable_preview_features 标志:

gcloud alloydb instances update INSTANCE_ID \
     --database-flags scann.enable_preview_features=on \
     --region=REGION_ID \
     --cluster=CLUSTER_ID \
     --project=PROJECT_ID

替换以下内容:

  • INSTANCE_ID:实例的 ID。
  • REGION_ID:实例所在的区域,例如 us-central1
  • CLUSTER_ID:实例所在集群的 ID。
  • PROJECT_ID:集群所在项目的 ID。

由于自动维护而对索引所做的任何更新都是永久性的,直到 AlloyDB 再次更新索引。

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

如需创建启用了自动索引维护功能的手动 ScaNN 索引,请运行以下示例命令:

CREATE INDEX INDEX_NAME ON TABLE \
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION) \
WITH (mode=MANUAL, num_leaves=NUM_LEAVES_VALUE, auto_maintenance=on);

替换以下内容:

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

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

  • EMBEDDING_COLUMN:用于存储 vector 数据的列。

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

    • L2 距离:l2

    • 点积:dot_product

    • 余弦距离:cosine

  • NUM_LEAVES_VALUE:要应用于此索引的分区数量。设置为介于 1 到 1048576 之间的任意值。如需详细了解如何确定此值,请参阅ScaNN 索引进行调优

您可以通过配置 scann.max_background_workers 数据库标志来提高多个索引的自动索引维护吞吐量。增加工作器数量会增加单位时间内处理的索引数量,但不会减少单个索引的处理时间。您还可以选择设置 scann.maintenance_background_naptime_s 数据库标志,以控制自动索引维护运行之间的最短延迟时间。

配置 pct_leaves_to_search 以实现自动索引维护

如果您已启用自动索引维护,则 AlloyDB 会根据启发式方法自动拆分分区,例如拆分超出特定大小的大型离群值分区。随着这些拆分导致分区的数量增加,您应调整要搜索的叶数量,以保持最佳性能。

如需自动管理要搜索的叶数量,请使用 pct_leaves_to_search。此参数可让您指定要搜索的分区数量所占的百分比。如果您预计数据集会大幅增长,请先将 pct_leaves_to_search 值设置为 1。默认情况下,此参数处于已停用状态。

将此值设置为当前分区数量所占的百分比。例如,如需搜索当前分区数量的 1%,请将此值设置为 1

您可以将此参数设置为 0100 之间的任何值。默认值为 0,这会停用此参数并使用 scann.num_leaves_to_search 计算要搜索的叶数量。

如需在数据库上设置 pct_leaves_to_search 标志,请运行以下命令:

ALTER DATABASE DATABASE_NAME SET scann.pct_leaves_to_search = PERCENTAGE_LEAVES_TO_SEARCH;

替换以下内容:

  • DATABASE_NAME:数据库的名称。
  • PERCENTAGE_LEAVES_TO_SEARCH:要搜索的 num_leaves 的百分比。

手动调用索引维护

如果您想按需对特定索引调用维护,请运行以下命令。此函数可在 alloydb_scann 版本 0.1.2 或更高版本中使用。

如需使用此函数,您必须先启用 scann.enable_preview_features 标志,如自动维护索引中所述。

SELECT scann_index_maintenance('INDEX_NAME');

手动重建索引

如果您想使用创建索引时指定的配置重建索引,可以手动重建索引。

如需手动重建索引,请运行以下命令:

REINDEX INDEX CONCURRENTLY INDEX_NAME;

INDEX_NAME 替换为要重建的索引的名称,例如 my-scann-index。索引名称会在整个数据库中共享。确保每个索引名称对数据库中的每个表中都是唯一的。

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

后续步骤