AnalyticDB PostgreSQL版向量索引查询
1. 创建带向量索引的表并生成测试数据
创建数据库账号,实例详情页登录数据库,执行以下语句,创建向量检索插件。
CREATE EXTENSION IF NOT EXISTS fastann; set optimizer=off
执行以下语句,创建带向量索引的表。
select exec_sql_on_pg_ann_codebooks('delete from pg_ann_codebooks'); CREATE DATABASE VEC; CREATE SCHEMA vec; CREATE TABLE 'vec'.'vector_test_for_sift' ( 'id' bigint NOT NULL, 'shot_time' timestamp, 'device_id' bigint, 'feature_data' 'float4'[], PRIMARY KEY(id) ) DISTRIBUTED BY (id); ALTER TABLE vec.vector_test_for_sift ALTER COLUMN shot_time SET STORAGE PLAIN; ALTER TABLE vec.vector_test_for_sift ALTER COLUMN device_id SET STORAGE PLAIN; ALTER TABLE vec.vector_test_for_sift ALTER COLUMN feature_data SET STORAGE PLAIN; CREATE INDEX idx_vector_test_for_sift_device_id ON vec.vector_test_for_sift (device_id); CREATE INDEX idx_vector_test_for_sift_shot_time ON vec.vector_test_for_sift (shot_time); CREATE INDEX idx_vector_test_for_sift_feature_data ON vec.vector_test_for_sift USING ann(feature_data) WITH (dim=128,pq_segments=16,hnsw_m=16,external_storage=1);
2. 导入数据
将脚本adbpg_test_tools上传至ECS。
上传至已购买的ECS实例。
打开abdpg_test_tools文件夹,将“configuration/dbConf”文件中的信息修改为已购买AnalyticDB PostgreSQL 6.0版实例的信息,设置地址、端口、密码、数据、表名等连接信息。示例如下:
执行以下语句,生成10W测试数据。
执行以下语句,导入测试数据。
连接AnalyticDB PostgreSQL 6.0版实例,并执行ANALYZE命令。
3. 不使用向量索引进行查询
执行以下语句,不使用向量索引进行查询。
返回结果如下:
执行以下语句,查看执行计划。
返回结果如下:
可以看到,执行逻辑是先使用顺序扫描,然后再进行排序,总共耗时72ms.。
4. 使用向量索引进行查询
换用重载过的操作符 <-> 比较向量的距离,使用向量索引进行查询。
返回相同的查询结果:
执行以下语句,查看执行计划。
返回结果如下:
从执行计划可以看出,使用向量索引,耗时仅13ms。
将两种执行方式的结果求交集,统计数量,观察召回性能。
执行结果为:
从执行结果看到总共数量为10条,在这个示例中两者的执行结果完全相同,召回率良好。
实验链接:https://developer.aliyun.com/adc/scenario/d4b623253ba14b5595cf825518883062