Arrays Postgres比较数组的最快方法

Arrays Postgres比较数组的最快方法,arrays,postgresql,Arrays,Postgresql,在存储过程中,我生成一个键数组,并希望将其与表中的键数组进行比较。比较两个数组以查看它们是否至少有一个值匹配的最快方法是什么 到目前为止,我们已经尝试了以下方法: 循环生成的密钥并将其与密钥字段进行比较(慢速) 在数组上使用数组操作重叠(&&) 以下是表的定义:征求 id bigint NOT NULL DEFAULT nextval('id_seq'::regclass), type_id bigint, name character varying(2000), key characte

在存储过程中,我生成一个键数组,并希望将其与表中的键数组进行比较。比较两个数组以查看它们是否至少有一个值匹配的最快方法是什么

到目前为止,我们已经尝试了以下方法:

  • 循环生成的密钥并将其与密钥字段进行比较(慢速)
  • 在数组上使用数组操作重叠(&&)
以下是表的定义:
征求

id bigint NOT NULL DEFAULT nextval('id_seq'::regclass),
type_id bigint,
name character varying(2000),
key character varying[],
status bigint
存储过程中的示例代码

-- keys = list of generated keys
FOR _id, _name, _type IN
   SELECT rec.eid, rec.domain, rec.name, rec.type_id
   from   solicitation rec 
   where  rec.key && _keys
   and    rec.status in (1201, 1202, 1241)
LOOP
...
END LOOP;

已编制索引

postgresql中的数组运算符非常快

但请注意,您应该使用
GIN
索引来提高性能


大多数情况下,在DB server中执行作业的性能更快,但请注意,如果数据库服务器过载,则创建web服务器的副本比创建数据库副本更容易,因此请尝试将负载从DB服务器移动到web服务器,以便更好地跨web服务器管理负载。

使用阵列重叠操作(&&&)速度很快,但速度减慢是由于生成的数组中存在空值


对于数百万的表大小,去掉空值将性能从6秒提高到300毫秒。

我们已经在使用GIN索引了。问题是生成的密钥数组中有空值,这大大降低了性能