本页介绍了维护向量索引的选项。维护索引有助于确保索引能够适应可能会影响搜索结果准确性的数据更改。请使用本页中介绍的策略,以免随着数据集的增长而导致查询性能下降。
查看向量索引指标
如果您的表容易频繁更新或插入,我们建议您定期重新编制现有 ScaNN 索引,以提高索引的检索准确性。您可以监控索引指标,查看自索引构建以来向量分布或向量更改的变化,然后相应地重新编制索引。
如需详细了解指标,请参阅查看矢量索引指标。
自动维护索引
在创建 ScaNN 索引时,您可以将 scann.enable_preview_features
数据库标志 (GUC) 与索引级 auto_maintenance
参数搭配使用。将这些设置搭配使用可让 AlloyDB 增量管理索引,以便在数据集增长时,它会拆分大型离群值分区。通过拆分分区,AlloyDB 会尝试提供更好的 QPS 和搜索结果。
自动维护对索引所做的任何更新都是永久性的,除非 AlloyDB 再次更新索引。
如需让 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。
启用 scann.enable_preview_features
标志后,您可以为索引启用自动维护,也可以启用 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。