为确保向量索引能够适应可能影响搜索结果准确率的变化,请维护向量索引。
准备工作
在管理索引维护之前,请安装或更新 vector 和 alloydb_scann 扩展程序:
如果未安装
vector和alloydb_scann扩展程序,请安装它们。CREATE EXTENSION IF NOT EXISTS vector; CREATE EXTENSION IF NOT EXISTS alloydb_scann;如果已安装
vector和alloydb_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:要应用于此索引的分区数。将此值设置为介于3和1048576之间的任意值。如需详细了解如何确定此值,请参阅 调优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 表示要搜索的当前分区所占的百分比。您可以将此参数设置为介于 0 和 100 之间的任意值。默认值为 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。