非常慢 SQL DELETE 对 table 的查询具有外键约束
Very slow SQL DELETE query on table with foreign key constraint
我在使用 SQL DELETE 查询时遇到了一些问题。
我在数据库 (postgres 9.3) 上工作,其中有 2 个表 (Parent 和 Child)。
child 与带有外键的 parent 有关系。
Parent Table
CREATE TABLE parent
(
id bigint NOT NULL,
...
CONSTRAINT parent_pkey PRIMARY KEY (id)
)
Child Table
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
删除时,Child
table需要被parent_id
查询以确保没有子行引用您所关注的父行删除。
为确保子查找快速运行,您需要在 Child
table 中的 parent_id
列上有一个索引。
我在使用 SQL DELETE 查询时遇到了一些问题。 我在数据库 (postgres 9.3) 上工作,其中有 2 个表 (Parent 和 Child)。 child 与带有外键的 parent 有关系。
Parent Table
CREATE TABLE parent
(
id bigint NOT NULL,
...
CONSTRAINT parent_pkey PRIMARY KEY (id)
)
Child Table
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
删除时,Child
table需要被parent_id
查询以确保没有子行引用您所关注的父行删除。
为确保子查找快速运行,您需要在 Child
table 中的 parent_id
列上有一个索引。