【问题标题】:Delete large number of rows in Postgres/SQLAlchemy/Alembic删除 Postgres/SQLAlchemy/Alembic 中的大量行
【发布时间】:2018-12-24 16:57:20
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python postgresql sqlalchemy flask-sqlalchemy alembic


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-11
      • 2018-06-20
      • 2022-08-24
      • 2017-01-08
      • 2021-09-07
      • 2021-08-04
      • 1970-01-01
      相关资源
      最近更新 更多