删除许多行而不锁定它们

Bjö*_*ist 8 sql postgresql locking sql-delete

在PostgreSQL中,我有一个类似下面的查询,它将从1m行表中删除250k行:

DELETE FROM table WHERE key = 'needle';
Run Code Online (Sandbox Code Playgroud)

查询需要一个多小时才能执行,在此期间,受影响的行将被锁定以进行写入.这并不好,因为这意味着许多更新查询必须等待大删除查询完成(然后它们将失败,因为行从它们下面消失但是没关系).我需要一种方法将这个大查询分成多个部分,以便尽可能减少对更新查询的干扰.例如,如果删除查询可以拆分为每个包含1000行的块,则其他更新查询最多必须等待涉及1000行的删除查询.

DELETE FROM table WHERE key = 'needle' LIMIT 10000;
Run Code Online (Sandbox Code Playgroud)

该查询可以很好地工作,但唉它在postgres中不存在.

Fra*_*ens 24

尝试使用subselect并使用一个独特的条件:

DELETE FROM 
  table 
WHERE 
  id IN (SELECT id FROM table WHERE key = 'needle' LIMIT 10000);
Run Code Online (Sandbox Code Playgroud)