“Truncate”或“Delete/Vacuum Full”用于删除某些表行

mct*_*una 2 postgresql truncate vacuum

我有一个 db,它有 223 个表,我必须从其中的 10 个表中删除一些记录,每个记录都有 apprx。150 万条记录。这些表每 7 秒存储一次温度。我们决定删除所有记录,但每分钟删除第一条记录。所以现在每分钟有 8 条记录,在此过程之后,它将每分钟存储 1 条超过 3 个月的记录。

我应该通过删除并在之后完全真空还是通过截断来完成?还有一些与其中一些表相关的视图。如果我通过截断来完成,这些视图之后会起作用吗?

Erw*_*ter 6

如果您没有阻止您在表上获得排他锁的并发事务,我会:

  1. 将(相对较少)幸存的行选择到临时表中。
    确保您有足够的 RAM 可用于临时表(仅限此会话)。temp_buffers在这个相关的答案中阅读:
    优化 PostgreSQL 中的批量更新性能
  2. 截断表格。
  3. 重新插入幸存者。

这样,视图保持不变。他们会禁止你删除涉及的表。
您也不需要任何吸尘,完全没有死行。在此过程中,您可能希望对ORDER BYINSERT进行优化SELECT性能。

这里这里是密切相关的案例,其中包含有关 SO 的更多详细信息。