我需要根据索引日期字段从 13 亿行表中删除大约 4 亿行。
该表的大小约为 800 GB。
在不造成不利影响的情况下删除数据的最有效方法是什么?该表被大量使用,这意味着大量的插入和更新(这不会影响要删除的行)。
有一个维护窗口,这将是最快的,但我可能无法获得足够大的维护窗口。另一方面,我可以花时间进行删除,所以不用着急。
我需要根据索引日期字段从 13 亿行表中删除大约 4 亿行。
该表的大小约为 800 GB。
在不造成不利影响的情况下删除数据的最有效方法是什么?该表被大量使用,这意味着大量的插入和更新(这不会影响要删除的行)。
有一个维护窗口,这将是最快的,但我可能无法获得足够大的维护窗口。另一方面,我可以花时间进行删除,所以不用着急。
想出了一个更好的方法来做到这一点
Insert into new_tbl select * from old_tbl where start_date < now -INTERVAL '2 years'
在停机时间窗口期间:
重命名
old_tbl
为old_tbl_drop
和new_tbl
。old_tbl
old_tbl_drop
。社区维基回答:
给自己写一个批处理脚本,比如说,10,000 次删除和提交,下一个 10,000 次等等。
您应该选择一个可以快速删除和提交的数字,这样您就不会干扰其他进程太长时间,但仍然值得让事情继续进行。
假设您能够及时找到要删除的记录。
如果您需要从 1.2 B 的表中删除 400 M。这意味着您必须标记死 400 M 行。这比重新编写 3 倍要快得多。所以在 PostgreSQL 上最有效的方法是一个简单的
顺便说一句,删除十亿行真的没什么大不了的。试试看。
也可以看看