sql - 对具有外键约束的表进行非常慢的 SQL DELETE 查询

标签 sql postgresql sql-delete

我在使用 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;

最佳答案

Parent删除时,需要通过parent_id查询Child表,确保没有子行引用父行您将要删除。

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

关于sql - 对具有外键约束的表进行非常慢的 SQL DELETE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32764363/

相关文章:

ruby-on-rails - Rails 在事件记录中排序以进行搜索

MySQL基于单一条件删除

sqlite - 如何在 SQLite 中为 DELETE 启用 LIMIT?

sql - SQL中查找保留关键字

mysql - 使用MySQL对多个条件进行计数操作

python - 从pydev导入数据到postgresql

postgresql - 无法使用 MD5 方法从主机连接到在 VM 上运行的 Postgres

sql - 在巨大的事件流中寻找差距?

mysql子查询计数返回全局计数并忽略where

Mysql删除和优化很慢