python - 删除 Postgres/SQLAlchemy/Alembic 中的大量行
问题描述
我有一个大约 150 GB 的表,在 Postgres 中有大约 10 亿行。我们有一个 Flask 应用程序,它使用 SQLAlchemy 插入到这个表中,我们通过 Alembic 处理数据库迁移。这对我们来说效果很好,但我们真的应该放弃大约 90% 的行。
我的第一种方法是通过 SQLAlchemy 删除行;然而,根据 RDS 图,释放的磁盘空间从未被回收,我相信这是因为我还没有在表上运行 vacuum full 命令,这似乎是一个昂贵的过程。
似乎有很多建议提到处理此类大规模删除的正确方法是重新创建表,复制必要的行,然后截断旧表。从概念上讲,这是有道理的,但即使在查看以下内容后,我也不确定执行此操作的正确方法是什么:
- 这似乎只适用于没有索引的简单表,并指向更复杂的表的#2
- 在我将其简化为一张桌子后,这看起来可以工作
- 使用 alembic 迁移创建新表;使用一些快速的 python 脚本从旧表中复制条目;截断旧表,然后重命名新表。
有人对我目前使用的堆栈有什么建议吗?更具体地说,我有以下担忧:
- 对于 #1 和 #2,运行 SQL 命令来重新创建表是否会以任何方式弄乱 Alembic?我担心 Alembic 中有一些元数据在运行 SQL 命令后不会被保留。
- 我觉得#3似乎是这里最合理的方法。这种方法有什么问题吗?
解决方案
我从未使用过 Alembic,但我用纯 PSQL 做过类似的事情。3号看起来像是要走的路。确保在复制条目之后和截断旧表之前添加任何索引和外键。将 15GB 的行插入到带有索引的表中会导致大量的重新索引并且需要很长时间。
至于 Alembic 元数据,我无能为力。也许尝试在不截断旧表的情况下将表重新创建为副本以验证没有丢失任何重要信息?只是一个想法。
推荐阅读
- arrays - Powershell 批处理文件中的结构化数组增加了额外的空间
- node.js - 将值“{ _id: 5bd587cffb6fc074abb12cb8,\n name: \'name 2\',\n year: \'4\',\n id: \'102\' }”转换为字符串失败,路径为“winner”
- python - ValueError:形状(831,18)和(1629,2)未对齐:18(dim 1)!= 1629(dim 0)
- emacs - 将文件写入新目录后,ido模式打开错误目录
- docker - 在 Kitematic (Docker for Mac) 中更改了 SA 密码,我丢失了 localhost 中的所有数据库
- javascript - Javascript:条件函数onClick按钮
- r - 使用 R,我尝试 1)子集 191 个 .txt 文件,然后 2)将生成的较小数据集合并到一个文件中。
- python - 检查两个无序序列是否相等
- jwt - 使用 JWT 身份验证的 laravel 5.7 中不存在身份验证控制器
- html - 创建在鼠标悬停时展开的号召性用语按钮