postgresql - 有效地修剪 postgresql 表

标签 postgresql performance foreign-keys

我有大约 10 个表,其中包含超过 200 万条记录,还有一个表包含 3000 万条记录。我想有效地从每个表中删除旧数据。

我的一般算法是:

  • 为每个大表创建一个临时表并用更新的数据填充它
  • 截断原始表
  • 使用以下命令将 tmp 数据复制回原始表:“insert into originaltable (select * from tmp_table)”

但是,将数据复制回的最后一步花费的时间比我想要的要长。我考虑过删除原始表并使临时表“永久”,但我丢失了约束/外键信息。

如果我直接从表中删除,则需要更长的时间。鉴于我需要保留所有外键和约束,是否有更快的方法来删除旧数据?

谢谢。

最佳答案

最快的过程可能与您所概述的完全一样:

  1. 将新数据复制到临时表中
  2. 删除索引和外键
  3. 删除旧表
  4. 将临时表复制回旧表名
  5. 重建索引和外键。

The Postgres manual也有一些关于性能的建议,这些建议可能适用也可能不适用。然而,坦率地说,删除一个表比删除数百万行要快得多(因为每次删除都是逐个元组执行的),并且将数百万行插入到没有约束或索引的表中要快得多(因为每个约束必须检查并且必须为每个记录插入更新每个索引;通过删除所有约束,您可以将其限制为索引的单个构建和约束的单个验证。

关于postgresql - 有效地修剪 postgresql 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671557/

相关文章:

python - 哪种算法可以更快地对这些数字对进行排序?

java - 限定方法调用是否会降低 Java 中的性能?

php - 通过 sql 查询删除记录及其外键

django-rest-framework - 如何在DRF中获取并显示父序列化器中的所有子对象

mysql - 在 MySQL 表上创建外键需要很长时间才能复制到 tmp 表

SQL 查询按两个不同的列分组

postgresql - UPSERT 测试代码中的语法错误

MYSQL:不能/如何使用子查询作为完全限定的 CTE

PostgreSQL 交叉表问题/"Return and SQL tuple descriptions are incompatible"

c++ - 为什么我的渲染线程占用了 100% 的 cpu?