【问题标题】:Huge delete on PostgreSQL table : Deleting 99,9% of the rows of the tablePostgreSQL 表上的大量删除:删除表中 99.9% 的行
【发布时间】:2021-10-27 14:47:39
【问题描述】:

我的 PostgreSQL 数据库中有一个表,它变得很大,里面有很多无用的行。 由于这些无用的行占我表数据的 99.9%(大约 330 万行),我想知道删除它们是否会对我的数据库产生不良影响:

我知道此操作可能需要一些时间,并且我将能够在维护操作期间阻止对表的写入 但我想知道数据的这种巨大变化是否也会影响操作本身之后的性能。

我找到了诸如创建新表/使用 TRUNCATE 删除所有行之类的解决方案,但由于此操作是特定的且一次性完成,因此我希望能够选择最适合的解决方案。

我知道 Postgre SQL 具有 VACUUM 机制,但我不是 DBA 专家:谁能确认此删除不会影响我的表完整性/数据结构,如果需要新数据,释放的空间将被回收?

PostgreSQL 11.12,在 AWS RDS 上具有默认设置。我的表上没有任何索引,删除行的条件不会基于 PK

【问题讨论】:

  • 创建表/截断/插入部分很可能是您可以获得的最快方法。甚至创建新表,删除旧表重命名新表。
  • 删除您的数据不会对表而不是结构产生负面影响,对数据表完整性产生负面影响(假设定义了正确的 FK),如果“删除”行违反它,Postgres 将中止整个过程。也就是说,在删除之前进行备份仍然不是一个坏主意。一旦完成运行vacuum full analyze。那么你应该准备好了。 BTW:330 万行不算大,可能上端很小。

标签: postgresql


【解决方案1】:

删除行通常不会缩小 PostgreSQL 表,因此您必须运行 VACUUM (FULL) 来压缩它,在此期间该表无法访问。

如果你要删除很多行,DELETEVACUUM (FULL) 都需要很长时间,你最好这样:

  • 创建一个像旧表一样定义的新表

  • INSERT INTO new_tab SELECT * FROM old_tab WHERE ... 复制您要保留的行

  • 删除指向旧表的外键约束

  • 在新表上创建所有索引和约束

  • 删除旧表并重命名新表

通过仔细计划,您可以在短时间内摆脱困境。

【讨论】:

  • 感谢您的回答,我将编写一个脚本来安排这些操作。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多