我们有一个包含三个索引列的表 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,以便它能够删除记录
答案 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。