postgresql 从Postgres删除大量数据的最佳做法

k4aesqcs  于 2023-02-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(1421)

我想从一个大表中删除几十万个条目。我使用的是PostgreSQL。据我所知,一个流行的安全方法是将表中条目的“待删除”主键复制到一个临时表中,然后使用连接将其删除。
有人能给我解释一下这样做的好处吗?还有你会用不同的方式来做吗?
我已经看过this link,它强调了技术,但是对我来说,它看起来就像运行脚本删除给定主键的表中的所有条目一样。

yftpprvb

yftpprvb1#

我不确定PostgreSQL的delete语法是否能让你像update语句和FROM子句一样“连接”,或者像另一个SQL实现让你运行“DELETE X FROM t1 AS X JOIN t2 AS Y USING(row_id);“,例如。
您可以在来自1个表的DELETE语句中使用WHERE子句,因此,如果删除条件取决于其他表中的记录,则首先编译符合条件的主键值列表可能会有好处(使用SELECT查询和您想要的任意多个JOIN),然后将键值列表传递到DELETE查询的简单WHERE子句中,因为WHERE子句中复杂的依赖于行的子查询可能比这慢。
为了提高服务器内存/资源效率,将查询/行查找操作分开也可能是有意义的(键值的SELECT)从存储修改操作(DELETE),而且我也听说过它被建议批量运行DELETE部分(比如一次100000行)以在存储器和日志上具有较轻的占用,但我不确定这在PostgreSQL中是明智的还是不必要的,也不确定它在不同的实现中是否会有所不同。
处理大数据集的一个普遍主题是,连续的小步骤或小块通常比大的复杂的单个动作执行得更好,后者很难一次提升太多东西。
如果您有一个简单的删除条件,可以直接放入目标表的WHERE子句中,并且您没有数百万行,那么最简单的“DELETE FROM _ WHERE _”查询可能会很好地为您服务。

相关问题