根据索引列从表中删除是永远的事

时间:2019-06-19 11:24:41

标签: postgresql

我们有一个包含三个索引列的表 bigint类型的column1 没有时区的timestamp类型的column2 没有时区的timestamp类型的column3 该表有超过1200万记录,我们正在尝试使用下面的查询

删除所有大于当前日期的记录-45天
delete from tableA
where column2 <= '2019-04-15 00:00:00.00' 
OR column3 <= '2019-04-15 00:00:00.00';

这将永远执行,永远不会完成。

有什么方法可以改善此查询的性能。

删除索引,删除数据并重新创建索引。但这不起作用,因为即使删除索引后我也无法删除数据。

 delete 
 from tableA 
 where column2 <= '2019-04-15 00:00:00.00' 
 OR column3 <= '2019-04-15 00:00:00.00'

我不想更改查询,但希望通过某些属性配置Postgres,以便它能够删除记录

1 个答案:

答案 0 :(得分:0)

另请参阅有关问题Best way to delete millions of rows by ID

的很好的讨论

12亿= = 1.2亿行?

从大索引表中删除是很慢的,因为在此过程中多次重建了索引。如果可以选择要保留的行并将其用于创建新表,然后删除旧表,则该过程将更快。如果定期执行此操作,请使用表分区并在需要时断开分区的连接,然后可以将其删除。

1)检查日志,您可能正陷入僵局。

2)尝试创建一个新表以选择所需的数据,然后拖放并重命名。使用查询中索引中的所有列。 DROP TABLE比DELETE .. FROM

快得多
    CREATE TABLE new_table AS (
        SELECT * FROM old_table WHERE 
        column1 >= 1 AND column2 >= current_date - 45 AND column3 >= current_date - 45);
    DROP TABLE old_table;
    ALTER TABLE new_table RENAME TO old_table;
    CREATE INDEX ...

3)使用基于日期的分区创建一个新表,该表具有15、30或45天(如果您定期删除45天之前的数据)。有关详细信息,请参见https://www.postgresql.org/docs/10/ddl-partitioning.html