Postgres删除速度超慢,如何改进?

时间:2017-06-21 09:32:12

标签: postgresql

我的查询

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)。

我无法将时间缩短到合理的长度:

  • 我尝试删除所有index-is(24h-s后取消)
  • 仅保留t1_t2_idx和t7_t1_idx ... t50_t1_idx索引(24小时后取消)
  • 保留所有索引(24小时后取消)

在删除之前还要进行真空分析,不应该有任何锁(只有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)"

0 个答案:

没有答案