我有一个约150 GB的表,在Postgres中有约10亿行。我们有一个Flask应用程序,它使用SQLAlchemy插入到该表中,并且通过Alembic处理数据库迁移。这对我们来说一直很好,但是我们真的应该放弃大约90%的行。
我的第一种方法是通过SQLAlchemy删除行;但是,根据RDS图表,释放的磁盘空间从未被回收,我相信这是因为我尚未在表上运行vacuum full命令,这似乎是一个昂贵的过程。
似乎有很多建议提到处理这种大规模删除的正确方法是重新创建表,复制必要的行,然后截断旧表。从概念上讲,这是有道理的,但是即使查看以下内容,我也不确定执行此操作的正确方法是什么:
有人对我当前使用的堆栈有任何建议吗?更具体地说,我有以下担忧:
答案 0 :(得分:0)
我从未使用过Alembic,但是我使用纯PSQL做过类似的事情。 3号看起来很可行。在复制条目之后和截断旧表之前,请确保添加任何索引和外键。在具有索引的表中插入15GB的行将导致大量的重新索引,并且要花很长时间。
对于Alembic元数据,我无能为力。也许尝试将表重新创建为副本而不截断旧表以确保没有重要内容丢失?只是一个想法。