我的查询
delete from test.t1 where t2_id = 1;
我的主表是t1(包含大约1M行,需要删除大约100k行)
CREATE TABLE test.t1
(
id bigserial NOT NULL,
t2_id bigint,
... other fields
CONSTRAINT pk_t1 PRIMARY KEY (id),
CONSTRAINT fk_t1_t2 FOREIGN KEY (t2_id)
REFERENCES test.t2 (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
我在普通字符串字段上有t2_id和3个其他索引的索引。
CREATE INDEX t1_t2_idx ON test.t1 USING btree (t2_id);
有多个(大约50个)表引用test.t1。我为每个引用它的表都有一个t1_id索引。
CREATE TABLE test.t7
(
id bigserial NOT NULL,
t1_id bigint,
... other fields
CONSTRAINT pk_objekt PRIMARY KEY (id),
CONSTRAINT fk_t7_t1 FOREIGN KEY (t1_id)
REFERENCES test.t1 (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE INDEX t7_t1_idx ON test.t7 USING btree (t1_id);
//No other indexes here
t1的内容在t1之前被删除,与从t1中删除相比,它的速度超快。要删除的行数比例相同(~10%),但行总数要小得多(约100K)。
我无法将时间缩短到合理的长度:
在删除之前还要进行真空分析,不应该有任何锁(只有db中的活动查询)。
我没有尝试复制到临时表并截断t1,但这似乎不合理,因为t1可以增长到10M行,在某些时候需要删除1M。
如何改进删除的任何想法?
修改
确定没有锁,因为pg_stat_activity只显示2个活动查询(delete和pg_stat_activity)
"Delete on test.t1 (cost=0.43..6713.66 rows=107552 width=6)"
" -> Index Scan using t1_t2_idx on test.t1 (cost=0.43..6713.66 rows=107552 width=6)"
" Output: ctid"
" Index Cond: (t1.t1_id = 1)"