在Postgres/SQLAlchemy/Alembi中删除大量行

2024-04-27 14:47:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

有人对我当前使用的堆栈有什么建议吗?更具体地说,我有以下关切:

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

Tags: 方法命令数据库应用程序flasksqlsqlalchemypostgres
1条回答
网友
1楼 · 发布于 2024-04-27 14:47:57

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

至于Alembic元数据,我无能为力。也许尝试在不截断旧表的情况下将表重新创建为副本,以验证没有丢失任何重要的内容?只是一个想法。在

相关问题 更多 >