查看向量索引指标
如果您的表容易频繁更新或插入,我们建议您定期重新编制现有的 ScaNN 索引,以提高索引的召回率准确率。您可以监控索引指标,以查看自构建索引以来向量分布或向量变更的变化,然后相应地重新编制索引。
如需详细了解指标,请参阅向量索引指标。
自动维护索引
在创建 ScaNN 索引时,您可以使用 scann.enable_index_maintenance
全局统一配置 (GUC) 数据库标志以及索引级 auto_maintenance
参数。同时使用这些设置可让 AlloyDB 随着数据集的增长逐步管理索引并拆分大型离群值分区。通过拆分分区,AlloyDB 尝试提供更好的每秒查询次数 (QPS) 和搜索结果。
自动维护索引更新会一直存在,直到 AlloyDB 再次更新该索引。
如需让 AlloyDB 自动维护索引,请将 alloydb_scann
扩展程序添加到 shared_preload_libraries
参数中,启用 scann.enable_index_maintenance
数据库标志,然后通过重启数据库来加载 alloydb_scann
扩展程序:
将
alloydb_scann
扩展程序加载到shared_preload_libraries
列表:sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,alloydb_scann'|" DATA_DIR/postgresql.conf
验证参数的配置是否已正确设置:
grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
通过在
postgresql.conf
文件中设置scann.enable_index_maintenance
标志来启用该标志:scann.enable_index_maintenance = ON
重启 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
索引进行调优。
管理用于自动搜索拆分分区的叶
如果您已启用索引自动维护,则 AlloyDB 会在达到 num_leaves
阈值时自动拆分分区。随着这些拆分导致分区的数量增加,您应调整要搜索的叶数量,以保持最佳性能。
如需自动管理要搜索的叶数量,请使用 pct_leaves_to_search
。此参数可让您指定要搜索的分区数量所占的百分比。如果您预计数据集会大幅增长,请先将 pct_leaves_to_search
值设置为 1。默认情况下,此参数处于已停用状态。
将此值设置为当前分区数量所占的百分比。例如,如需搜索当前分区数量的 1%,请将此值设置为 1
。
您可以将此参数设置为 0
到 100
之间的任何值。默认值为 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
的百分比。
手动调用维护
如果您想按需对特定索引调用维护,请运行以下命令:
SELECT scann_index_maintenance('INDEX_NAME');
手动重建索引
如果您想使用创建索引时指定的配置重建索引,可以手动重建索引。
如需手动重建索引,请运行以下命令:
REINDEX INDEX CONCURRENTLY INDEX_NAME;
将 INDEX_NAME
替换为要重建的索引的名称,例如 my-scann-index
。索引名称会在整个数据库中共享。确保每个索引名称对数据库中的每个表中都是唯一的。
如需详细了解如何在 PostgreSQL 中重新编制索引,请参阅 REINDEX。