如何快速删除postgres中的行?

时间:2021-05-24 14:26:42

标签: sql postgresql

我的表有 17,000,000 行。我需要在某些条件下删除 500,000。此时我有一个 500,000 行的脚本看起来像

delete from table where name = 'John' and date = '2010-08-04';
delete from table  where name = 'John' and date = '2010-08-05';
delete from table  where name = 'Adam' and date = '2010-08-06';

一行执行了大约 2.5 秒。它太长了。如何提高速度?

2 个答案:

答案 0 :(得分:3)

如果名称和日期字段没有索引,请尝试创建以下索引并尝试您的代码。

CREATE INDEX idx_table_name_date  ON table  (name, date)

如果可能,您还可以通过合并它们来最小化删除语句的数量。

代替

delete from table where name = 'John' and date = '2010-08-04';
delete from table  where name = 'John' and date = '2010-08-05';

可以是:

delete from table where name = 'John' and date in('2010-08-04','2010-08-05');

答案 1 :(得分:3)

我建议您将要删除的行加载到表中并使用:

delete from table t
   from todelete td
   where t.name = td.name and t.date = td.date;

即使没有索引,这也应该比无数个单独的 delete 语句快。但您希望在 table(name, date) 上建立索引以提高性能。

如果数据已经来自表或查询,那么您可以直接使用它。

您还可以通过在 from 子句中显式列出值来将其合并到一个查询中:

delete from table t
    from (values ('John', '2010-08-04'),
                 ('John', '2010-08-05')
                 ('Adam', '2010-08-06')
         ) todelete
    where t.name = td.name and t.date = td.date;
相关问题