对带有外键约束的表的 SQL DELETE 查询非常慢

Sim*_*ach 5 sql postgresql sql-delete

我在使用 SQL DELETE 查询时遇到了一些麻烦。我在一个有 2 个表(父和子)的数据库(postgres 9.3)上工作。孩子通过外键与父母建立关系。

父表

CREATE TABLE parent
(
  id bigint NOT NULL,
  ...
  CONSTRAINT parent_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

子表

CREATE TABLE child
(
  id bigint NOT NULL,
  parent_id bigint,
  ...
  CONSTRAINT child_pkey PRIMARY KEY (id),
  CONSTRAINT fk_adc9xan172ilseglcmi1hi0co FOREIGN KEY (parent_id)
      REFERENCES parent (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
Run Code Online (Sandbox Code Playgroud)

我在两个表中都插入了 200'000 个没有任何关系的条目(Child.parent_id = NULL)

但是像下面这样的 DELETE 查询的持续时间超过 20 分钟。而且即使没有 WHERE 条件。

DELETE FROM Parent;
Run Code Online (Sandbox Code Playgroud)

如果我不添加关系约束,执行时间将在 400 毫秒内完成。

我错过了什么?

一个可行的解决方案是下面的示例。但我不知道这是否是个好主意。也许有人可以告诉我一个更好的方法来做到这一点。

BEGIN WORK;
ALTER TABLE Parent DISABLE TRIGGER ALL;
DELETE FROM Parent;
ALTER TABLE Parent ENABLE TRIGGER ALL;
COMMIT WORK;
Run Code Online (Sandbox Code Playgroud)