在Postgres / SQLAlchemy / Alembic

时间:2018-07-17 05:26:40

标签: python postgresql sqlalchemy flask-sqlalchemy alembic

我有一个约150 GB的表,在Postgres中有约10亿行。我们有一个Flask应用程序,它使用SQLAlchemy插入到该表中,并且通过Alembic处理数据库迁移。这对我们来说一直很好,但是我们真的应该放弃大约90%的行。

我的第一种方法是通过SQLAlchemy删除行;但是,根据RDS图表,释放的磁盘空间从未被回收,我相信这是因为我尚未在表上运行vacuum full命令,这似乎是一个昂贵的过程。

似乎有很多建议提到处理这种大规模删除的正确方法是重新创建表,复制必要的行,然后截断旧表。从概念上讲,这是有道理的,但是即使查看以下内容,我也不确定执行此操作的正确方法是什么:

  1. This似乎仅适用于没有索引的简单表,而指向更复杂的表的#2
  2. This在将其简化为一张表后似乎可以正常工作
  3. 使用Alembic迁移来创建新表;使用一些快速的python脚本复制旧表中的条目;截断旧表,然后重命名新表。

有人对我当前使用的堆栈有任何建议吗?更具体地说,我有以下担忧:

  1. 对于#1和#2,运行SQL命令以重新创建表是否会使Alembic陷入混乱?我担心Alembic中的某些元数据在运行SQL命令后将无法保留。
  2. 我觉得#3似乎是这里最合理的方法。这种方法有什么问题吗?

1 个答案:

答案 0 :(得分:0)

我从未使用过Alembic,但是我使用纯PSQL做过类似的事情。 3号看起来很可行。在复制条目之后和截断旧表之前,请确保添加任何索引和外键。在具有索引的表中插入15GB的行将导致大量的重新索引,并且要花很长时间。

对于Alembic元数据,我无能为力。也许尝试将表重新创建为副本而不截断旧表以确保没有重要内容丢失?只是一个想法。