【问题标题】:Very slow SQL DELETE query on table with foreign key constraint对具有外键约束的表进行非常慢的 SQL DELETE 查询
【发布时间】:2015-09-24 14:45:34
【问题描述】:

我在使用 SQL DELETE 查询时遇到了一些问题。 我在一个数据库 (postgres 9.3) 上工作,其中有 2 个表 (父子)。 孩子与父母有一个外键关系。

父表

CREATE TABLE parent
(
  id bigint NOT NULL,
  ...
  CONSTRAINT parent_pkey PRIMARY KEY (id)
)

子表

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
)

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

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

DELETE FROM Parent;

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

我错过了什么?

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

BEGIN WORK;
ALTER TABLE Parent DISABLE TRIGGER ALL;
DELETE FROM Parent;
ALTER TABLE Parent ENABLE TRIGGER ALL;
COMMIT WORK;

【问题讨论】:

  • 嗯...你的Triggers在做什么?
  • 我认为他们没有做任何事情,因为'NO ACTION'声明
  • 我自己没有添加任何触发器,但我认为数据库会因为限制自动添加一些触发器。

标签: sql postgresql sql-delete


【解决方案1】:

当你从Parent删除时,Child表需要parent_id查询,以确保没有子行引用你要删除的父行。

为确保子查找快速运行,您需要在Child 表中的parent_id 列上建立索引。

【讨论】:

  • 我要注意的第一点。但第二个真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多