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)
当您删除 from 时Parent,Child需要查询表以parent_id确保没有子行引用您要删除的父行。
为了确保子查找快速运行,您需要在表parent_id中的列上有一个索引Child。
| 归档时间: |
|
| 查看次数: |
2926 次 |
| 最近记录: |