Postgresql Postgres中的多次删除,每次删除后都有一个提交
我有大约3000万条记录要从表中删除,即使删除10.000条记录也需要30分钟。我关心的是对所有3000万条记录发出delete命令,所以我想批量删除 所以我的方法是循环删除一个批,然后提交,然后循环删除下一个批。但这会产生以下错误:Postgresql Postgres中的多次删除,每次删除后都有一个提交,postgresql,sql-delete,Postgresql,Sql Delete,我有大约3000万条记录要从表中删除,即使删除10.000条记录也需要30分钟。我关心的是对所有3000万条记录发出delete命令,所以我想批量删除 所以我的方法是循环删除一个批,然后提交,然后循环删除下一个批。但这会产生以下错误: LOCATION: exec_stmt_raise, pl_exec.c:3216 ERROR: 0A000: cannot begin/end transactions in PL/pgSQL HINT: Use a BEGIN block with an
LOCATION: exec_stmt_raise, pl_exec.c:3216
ERROR: 0A000: cannot begin/end transactions in PL/pgSQL
HINT: Use a BEGIN block with an EXCEPTION clause instead.
这是我写的代码:
DO $$
BEGIN
FOR i in 1..30000 loop
DELETE FROM my_table
WHERE id IN (
SELECT id
FROM my_table
WHERE should_delete = true
LIMIT 1000
);
RAISE NOTICE 'Done with batch %', i;
COMMIT;
END LOOP;
END
$$;
实现这一目标的替代方案是什么?我突然想到了几件事:
。。。这是由我的表的外键引起的…
请添加表的定义,包括键和索引。如果要删除所有行,为什么不截断
?。。快速易用并不是所有的行,它就像60%的行扫描—禁用触发器或删除过程所需—添加一个支持FK:在my_child_表(父\u id)上创建索引的索引代码>