如何解决使用部分索引更新和插入性能
对于从大表(约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;
对于那些查询,我创建了部分索引:
- 对于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;
- 对于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 举报,一经查实,本站将立刻删除。