【发布时间】:2018-12-24 16:57:20
【问题描述】:
我有一个大约 150 GB 的表,在 Postgres 中有大约 10 亿行。我们有一个 Flask 应用程序,它使用 SQLAlchemy 插入到这个表中,我们通过 Alembic 处理数据库迁移。这对我们来说效果很好,但我们真的应该放弃大约 90% 的行。
我的第一个方法是通过 SQLAlchemy 删除行;然而,根据 RDS 图,释放的磁盘空间从未被回收,我相信这是因为我还没有在表上运行 vacuum full 命令,这似乎是一个昂贵的过程。
似乎有很多建议提到处理此类大量删除的正确方法是重新创建表,复制必要的行,然后 TRUNCATE 旧表。从概念上讲,这是有道理的,但即使在查看以下内容后,我也不确定执行此操作的正确方法是什么:
- This 似乎只适用于没有索引的简单表,并指向 #2 用于更复杂的表
- This 在我将其简化为一张表后似乎可以工作
- 使用 Alembic 迁移创建新表;使用一些快速的 python 脚本从旧表中复制条目;截断旧表,然后重命名新表。
有人对我目前使用的堆栈有什么建议吗?更具体地说,我有以下担忧:
- 对于#1 和#2,运行 SQL 命令来重新创建表是否会以任何方式混淆 Alembic?我担心 Alembic 中有一些元数据在运行 SQL 命令后不会被保留。
- 我觉得#3 似乎是这里最合理的方法。这种方法有什么问题吗?
【问题讨论】:
标签: python postgresql sqlalchemy flask-sqlalchemy alembic