微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用部分索引更新和插入性能

如何解决使用部分索引更新和插入性能

对于从大表(约100-200M行)中提取数据,我有不同的查询。我为表创建了具有不同谓词的部分索引以适合查询,因为我知道每个查询。 例如,与此类似的表:

CREATE TABLE public.contacts (
    id int8 NOT NULL DEFAULT ssng_generate_id(8::bigint),created timestamp NOT NULL DEFAULT timezone('UTC'::text,Now()),contact_pool_id int8 NOT NULL,project_id int8 NOT NULL,state_id int4 NOT NULL DEFAULT 10,order_x int4 NOT NULL,next_attempt_date timestamp NULL,CONSTRAINT contacts_pkey PRIMARY KEY (id)
);

查询有两种类型:

SELECT * FROM contacts WHERE contact_pool_id = X AND state_id = 10 ORDER BY order_x LIMIT 1;

SELECT * FROM contacts WHERE contact_pool_id = X AND state_id = 20 AND next_attemp_date <= Now ORDER BY next_attemp_date LIMIT 1;

对于那些查询,我创建了部分索引:

  1. 对于state_id = 10(新联系人)

CREATE INDEX ix_contacts_cpid_orderx_id_for_new ON contacts USING btree (contact_pool_id,order_x,id) WHERE state_id = 10;
  1. 对于state_id = 20(可用联系人)
CREATE INDEX ix_contacts_cpid_nextattepmdate_id_for_available ON contacts USING btree (contact_pool_id,next_attempt_date,id) WHERE state_id = 20;

对我来说,那些局部索引比单个索引快。

那更新和插入性能如何?如果我更改state_id = 20的行,它只会影响索引2(对于可用联系人)还是会同时受到影响?

解决方法

与元组无关的部分索引将不会更新。

如果PostgreSQL可以进行HOT更新(如果要更改的列不是索引的一部分,并且新元组在同一页上有空间),那么即使是相关索引也不需要更新。

,

是的,使用部分索引,您只需要为满足WHERE条件的行修改索引的开销,因此您始终只需要同时最多修改一个索引(除非您将state_id从10更改为20,反之亦然)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。