维护向量索引

本页介绍了维护向量索引的选项。维护索引有助于确保索引能够适应可能会影响搜索结果准确性的数据更改。请采用本页面中介绍的策略,以免随着数据集的增长而导致查询性能下降。

查看向量索引指标

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

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

自动维护索引

在创建 ScaNN 索引时,您可以将 scann.enable_index_maintenance Grand Unified Configuration (GUC) 数据库标志与索引级 auto_maintenance 参数搭配使用。将这些设置搭配使用可让 AlloyDB 在数据集不断增长时增量管理索引并拆分大型离群值分区。通过拆分分区,AlloyDB 会尝试提高每秒查询次数 (QPS) 和搜索结果的质量。

自动维护索引更新会持续存在,直到 AlloyDB 再次更新索引。

如需让 AlloyDB 自动维护索引,请将 alloydb_scann 扩展程序添加到 shared_preload_libraries 参数中,启用 scann.enable_index_maintenance 数据库标志,然后通过重启数据库加载 alloydb_scann 扩展程序:

  1. alloydb_scann 扩展程序加载到 shared_preload_libraries 列表中:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,alloydb_scann'|" DATA_DIR/postgresql.conf
  2. 验证参数的配置是否设置正确:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. postgresql.conf 文件中设置 scann.enable_index_maintenance 标志,以启用该标志:

    scann.enable_index_maintenance = ON
  4. 重启 AlloyDB Omni 以使参数更改生效:

    Docker

     docker container restart CONTAINER_NAME

    CONTAINER_NAME 替换为您在启动 AlloyDB Omni 容器时为其分配的名称。

    Podman

     podman container restart CONTAINER_NAME

    CONTAINER_NAME 替换为您在启动 AlloyDB Omni 容器时为其分配的名称。

启用 scann.enable_index_maintenance 标志后,您可以为索引启用自动维护,也可以启用 scann_index_maintenance 函数以手动调用维护。

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

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

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (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 索引

手动调用维护

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

SELECT AS scann_index_maintenance('INDEX_NAME');

管理叶子以自动搜索分屏分区

如果您已启用索引自动维护功能,则 AlloyDB 会在达到 num_leaves 阈值时自动拆分分区。由于这些分块,分区数量会增加,因此您应调整要搜索的叶子数量,以保持最佳性能。

如需管理自动搜索的叶子数量,请使用 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 所占的百分比。

手动重建索引

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

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

REINDEX INDEX CONCURRENTLY INDEX_NAME;

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

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

后续步骤