2

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

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

  • 循环生成的键并将它们与键字段进行比较(慢)
  • 在数组上使用数组操作重叠 (&&)

下面是表的定义:solicitation

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;

key被索引。

4

2 回答 2

2

使用数组重叠操作 (&&) 速度很快,但速度变慢是由于生成的数组中存在 NULL。

删除 NULL 将性能从 6 秒提高到 300 毫秒,以实现数百万的表大小。

于 2012-12-16T15:29:05.883 回答
1

postgresql 中的数组运算符非常快。

但请注意,您应该使用GIN索引来获得性能改进。

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

于 2012-12-14T15:43:58.150 回答